可以使用var来声明局部变量,而不是使用准确的类型。根据内容判断类型。 var name = ‘Bob’
String name = ‘Bob’
空安全
Dart 语言要求以健全的空安全方式编写代码。对于 toString()
方法和 hashCode
属性,空安全会体现出例外情况。
- 当为变量、参数或另一个相关组件指定类型时,可以控制该类型是否允许
null
。要让一个变量可以为空,可以在类型声明的末尾添加?
。String?name
- 必须在使用变量之前对其进行初始化。可空变量是默认初始化为
null
的。 Dart 不会为非可空类型设置初始值,它强制要求设置初始值。 Dart 不允许观察未初始化的变量。这可以防止在接收者类型可以为null
但null
不支持的相关方法或属性的情况下使用它。 - 不能在可空类型的表达式上访问属性或调用方法。同样的例外情况适用于
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
和 展开操作符(...
和 ...?
)
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
对象及其字段不能被更改:它们是 不可变的。