阅读 1152

2.认识Dart中的对象和变量

目录传送门:《Flutter快速上手指南》先导篇

万物皆对象

在 Dart 中,万物皆对象,包括函数。

所有的对象都继承自 Object 类。

并且,所有对象的默认值都是 null

void main() {
  var test_var;
  print("value = $test_var");
}


>>>
value = null
复制代码

如何声明变量

  1. 使用 var 关键字

    var name = 'Bob';
    复制代码

    使用 var 可以声明一个不定类型的变量,但当该变量被第一次赋值时,该变量类型就被确定。

    从此,你不能再改变该变量的类型,任何错误的尝试,你都会得到编译器的报错。

    eg:

    name = 1;
    
    
    >>>
    A value of type 'int' can't be assigned to a variable of type 'String'.
    复制代码
  2. 使用 dynamicObject

    这两个家伙具有同样的效果!

    它们都可以达到声明一个可变类型的变量的效果,即你可以随时使用该变量来指向任何一种类型的对象。

    当然,编译器是不会告诉你你犯了任何的错误,它只会让你的代码被顺利的编译 😄

    确切来说,dynamic 实际上是一个关键字,而 Object 之所以有同样的效果,完全是因为任何对象类型,都源自于它。

    所以你看,它两具有同样的效果,但具有不同的原理。

    eg:

    void main() {
      dynamic name = "Bob";
      print("value = $name");
      name = 1;
      print("value = $name");
    }
    
    
    >>>
    value = Bob
    value = 1
    复制代码

    换成 Object 也会得到同样的结果。

  3. 使用具体对象声明

    String name = 'Bob';
    复制代码

    对此,我想我不用有太多的解释。

  4. 使用 finalconst

    如果你希望一个对象被初始化后,不能再被修改,那么你应该使用这两个关键字。

    final name = 'Bob';
    final String nickname = 'Bobby';
    
    const bar = 1000000;
    const double atm = 1.01325 * bar;
    复制代码

    到现在为止,它两看起来没什么差别。

    const 厉害的地方在于,它是编译时常量的关键字,你在编译期就需要确定它的初始值。

    而 final 只会在运行时才要求确定初始值。

    const 除了可以声明一个不可变的常量外,还可以用来创建常量数组。

    void main() {
      var userInfo = const [];
      final githuber = const ['CoorChice'];
      const nums = [1, 2, 3];
    
      userInfo = ['bob', 2];
      print(userInfo);
    }
    
    
    >>>
    [bob, 2]
    复制代码

    第一项之所能够被改变,是因为我们定一个是个 const [] 常量数组。

    而剩余两项初始化后不能被改变对象的值,finalconst 都是被作为常量关键字被使用的,而被它们修饰的变量,不能再修改其值。

扩展

  • ??= 操作符

    考虑以下例子:

    b ??= value;
    复制代码

    如果 b 为 null,就会把 value 赋值给 b。

    如果 b 不为 null,则仍然保持原值。

目录传送门:《Flutter快速上手指南》先导篇

如何找到我?

传送门:CoorChice 的主页

传送门:CoorChice 的 Github