Dart 中一切皆对象 Object!
变量
类型推断
1. dart 可以类型推断。
变量存储对变量值的"引用(Reference)"
var name = 'Bob';
也可以声明类型
String name = 'Bob';
Null Safety
Dart 语言强制执行“健全的Null 安全(Sound Null Safety)”。Null Safety 能防止无心的访问值为 null 的变量的错误,这个错误称为 null dereference error,当访问的属性或方法被评估(evaluate)为 null 时 ,就会发生null dereference error。
例外:当 null 支持(support)属性或方法时,比如
toString()
或hashCode。
Dart 编译器会在编译时检测到
null dereference error,因此不会造成运行时错误。Sound Null Safety将潜在的runtime errors 转变为edit-time编辑时分析错误。
Dart 引入的关键改变
1. 可以使用?来控制变量、参数等是否可以为 null
String? name // Nullable type. Can be `null` or string. String name // Non-nullable type. Cannot be `null` but can be string.
2. 变量使用之前必须初始化。
可为 Null的变量(Nullable variables),默认值为 null,可以不设初始值。
非Null 的变量(non-nullable),没有默认值,必须自己初始化,在初始化之前不能被 observe
Sound Null Safety将潜在的runtime errors 转变为edit-time编辑时分析错误。
当non-null variable处于以下状态时,Null Safety会标记该变量:
- 未使用non-null 值进行初始化。
- 分配了一个空值。
Default value
Nullable variables 默认值为 null,可以不设初始值。
Non-null variable 声明时可以不用设初始值,但是使用之前必须赋值。
Top-level 和Class变量是延迟初始化的;初始化代码在第一次使用变量时运行。
Late variables
使用场景:
- 声明一个Non-null variable,该变量在声明后进行初始化。
- 延迟初始化一个变量。
Dart 可以在non-nullable variable使用之前检测它是什么时候赋的值,但通常无法检测top-level variables 和实例变量。
late String description; void main() { description = 'Feijoada!'; print(description); }
如果能保证变量会在使用赋值,就可以使用 late。
如果使用了late 定义一个变量,后来没有初始化,runtime时会报错。
lazy initialization(类似iOS 懒加载)
当使用 late 标记一个变量,同时在声明时赋初始值,那么这个initializer 在变量第一次使用时才执行。在一些场景中使用很方便:
- 变量不一定会被使用,并且初始化成本很高。
- 初始化一个实例变量,并且它的初始化程序需要访问 this。(同Swift 类加载函数中使用Self)
// This is the program's only call to readThermometer(). late String temperature = readThermometer(); // Lazily initialized.
Final and const(常量)
如果不打算修改变量,请使用 Final 或 const,替代 var 或作为类型的补充。
Final 变量只能设置一次;
Const 变量是编译时常量。 Const 变量是隐式的 Final 变量。
实例变量可以使用 final 不能使用 C
onst。
直接使用类型声明,创建的是一个变量,不是常量。
final name = 'Bob'; // Without a type annotation final String nickname = 'Bobby'; // With a type annotation