Flutter——dart

Posted wzj_what_why_how

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter——dart相关的知识,希望对你有一定的参考价值。

dart(一)

变量声明

  • var:它可以接收任何类型的变量, var 变量一旦赋值,类型便会确定,则不能再改变其类型。eg:var str = “KL”

  • dynamic 和 Object:

    • Object 是 Dart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。 dynamic与Object声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var 是不同的,如:

        dynamic t;
        Object x;
        t = "hi world";
        x = 'Hello Object';
        //下面代码没有问题
        t = 1000;
        x = 1000;
      
    • dynamic与Object不同的是: dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错,如:

         dynamic a;
         Object b = "";
         main() 
           a = "";
           printLengths();
         
      
         printLengths() 
           // 正常
        print(a.length);
           // 报错 The getter 'length' is not defined for the class 'Object'
           print(b.length);
         
      
    • dynamic 的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误,比如下面代码在编译时不会报错,而在运行时会报错:

      print(a.xx); // a是字符串,没有"xx"属性,编译时不会报错,运行时会报错。
      
  • final和const
    如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。 一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量(编译时直接替换为常量值),final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:

      //可以省略String这个类型声明
      final str = "hi world";
      //final String str = "hi world";
      const str1 = "hi world";
      //const String str1 = "hi world";
    

函数

Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

  • 函数声明

    bool isNoble(int atomicNumber) 
      return _nobleGases[atomicNumber] != null;
    
    

    ps:Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断。
    对于只包含一个表达式的函数,可以使用简写语法:

      bool isNoble (int atomicNumber)=> true ;
    
  • 函数作为变量

    var say = (str)
      print(str);
    ;
    say("hi world");
    
  • 函数作为参数传递

    void execute(var callback) 
        callback();
    
    execute(() => print("xxx"))
    
  • 可选的位置参数
    包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面:

    String say(String from, String msg, [String? device]) 
      var result = '$from says $msg';
      if (device != null) 
        result = '$result with a $device';
      
      return result;
    
    
  • 可选的命名参数
    定义函数时,使用param1, param2, …,放在参数列表的最后面,用于指定命名参数。例如:

    //设置[bold]和[hidden]标志
    void enableFlags(bool bold, bool hidden) 
        // ...
    
    

    调用函数时,可以使用指定命名参数。例如:paramName: value

    enableFlags(bold: true, hidden: false);
    

ps:可选命名参数在Flutter中使用非常多。注意,不能同时使用可选的位置参数和可选的命名参数。


mixin

Dart 继承:A extends B
Dart 是不支持多继承的,但是它支持 mixin,简单来讲 mixin 可以 “组合” 多个类,我们通过一个例子来理解。

定义一个 Person 类,实现吃饭、说话、走路和写代码功能,同时定义一个 Dog 类,实现吃饭、和走路功能:

class Person 
  say() 
    print('say');
  


mixin Eat 
  eat() 
    print('eat');
  


mixin Walk 
  walk() 
    print('walk');
  


mixin Code 
  code() 
    print('key');
  


class Dog with Eat, Walk
class Man extends Person with Eat, Walk, Code

我们定义了几个 mixin,然后通过 with 关键字将它们组合成不同的类。有一点需要注意:如果多个mixin 中有同名方法,with 时,
会默认使用最后面的 mixin 的,mixin 方法中可以通过 super 关键字调用之前 mixin 或类中的方法。

以上是关于Flutter——dart的主要内容,如果未能解决你的问题,请参考以下文章

颤动:使用navigator.dart时失败断言

flutter: SharedPreferences桌面插件

Flutter开发 Flutter 包和插件 ( 开发 Dart 插件包 | 发布 Dart 插件包 )

错误:未找到:'dart:ui' import 'dart:ui' - Flutter

flutter Dart语言List如何获取索引值

颤振无法导入`flutter_webrtc.dart`