Skip to content

可以使用var来声明局部变量,而不是使用准确的类型。根据内容判断类型。 var name = ‘Bob’String name = ‘Bob’

空安全

Dart 语言要求以健全的空安全方式编写代码。对于 toString() 方法和 hashCode 属性,空安全会体现出例外情况。

  1. 当为变量、参数或另一个相关组件指定类型时,可以控制该类型是否允许 null 。要让一个变量可以为空,可以在类型声明的末尾添加 ? 。String?name
  2. 必须在使用变量之前对其进行初始化。可空变量是默认初始化为 null 的。 Dart 不会为非可空类型设置初始值,它强制要求设置初始值。 Dart 不允许观察未初始化的变量。这可以防止在接收者类型可以为 null 但 null 不支持的相关方法或属性的情况下使用它。
  3. 不能在可空类型的表达式上访问属性或调用方法。同样的例外情况适用于 null 支持的属性或方法,例如 hashCode 或 toString() 。 空安全将潜在的 运行时错误 转变为 编辑时 分析错误。当非空变量处于以下任一状态时,空安全会识别该变量:未使用非空值进行初始化,赋值为null

默认值

具有可空类型的未初始化变量的初始值为 null 。即使是具有数值类型的变量,初始值也为空,因为数字(就像 Dart 中的其他所有东西一样)都是对象。 在生产环境中运行代码时,assert() 调用会被忽略。另外在开发过程中,assert(_condition_) 如果其 条件 为 false,会抛出一个异常。 必须在使用非空变量之前初始化它们的值。 不必在声明变量时初始化变量,但在使用之前需要为其赋值。 顶级变量和类变量是延迟初始化的,它们会在第一次被使用时再初始化。

延迟初始化变量

late修饰符两种用法:声明非空变量,但不在声明初始化和延迟初始化一个变量。 通常 Dart 的语义分析可以检测非空变量在使用之前是否被赋值,但有时会分析失败。常见的两种情况是在分析顶级变量和实例变量时,Dart 通常无法确定它们是否已设值,因此不会尝试分析。 确定变量在使用之前已设置,但 Dart 推断错误的话,可以将变量标记为 late 来解决这个问题。 如果没有初始化一个 late 变量,那么当变量被使用时会发生运行时错误。 当一个 late 修饰的变量在声明时就指定了初始化方法,那么内容会在第一次使用变量时运行初始化。这种延迟初始化在以下情况很方便:

  • (Dart 推断)可能不需要该变量,并且初始化它的开销很高。
  • 正在初始化一个实例变量,它的初始化方法需要调用 this

终值 (final) 和常量 (const)

如果不打算更改一个变量,可以使用 final 或 const 修饰它,而不是使用 var 或作为类型附加。一个 final 变量只能设置一次,const 变量是编译时常量。(const 常量隐式包含了 final。) 实例变量 可以是 final 但不能是 const。 请使用 const 修饰 编译时常量 的变量。 const 关键字不仅仅可用于声明常量,你还可以使用它来创建常量 值(values),以及声明 创建(create) 常量值的构造函数。任何变量都可以拥有常量值。 const 关键字不仅仅可用于声明常量,你还可以使用它来创建常量 值(values),以及声明 创建(create) 常量值的构造函数。任何变量都可以拥有常量值。 如果一个变量没被声明为 final 或者 const,那么,即使它的值是 const,仍然可以修改这个变量。不能修改 const 变量的。 可以在定义常量时使用 类型检查和转换is 和 as)、 集合中的 if 和 展开操作符... 和 ...?

dart
const Object i = 3; //这是一个const对象 伴随着一个int值
const list = [i as int]; //为list[]的值定义了一个int类型
const map ={if (i is int)i:'int'}; //使用和收集
const set ={if (list is List<int>...list)}; // 传播

虽然 final 对象不能被修改,但它的字段可能可以被更改。相比之下,const 对象及其字段不能被更改:它们是 不可变的

Wildcard variables 通配符变量