在 Flutter 中,在变量类型之前使用“late”关键字和在变量类型之后使用“?”标记有什么区别?

7 null non-nullable flutter

我认为在新的 Dart 规则中,变量不能声明/初始化为 null。所以我们必须late在变量类型之前放置一个关键字,如下所示:

late String id;
Run Code Online (Sandbox Code Playgroud)

或者?变量类型后面的标记,如下所示:

String? id;
Run Code Online (Sandbox Code Playgroud)

这两者是相等的还是有一些区别?

小智 3

可空变量无需在使用前进行初始化。

默认初始化为 null:

void main() {
  String? word;
  
  print(word); // prints null
}
Run Code Online (Sandbox Code Playgroud)

关键字late 可用于标记稍后将初始化的变量,即不是在声明它们时而是在访问它们时初始化。这也意味着我们可以拥有稍后初始化的不可空实例字段:

class ExampleState extends State {
  late final String word; // non-nullable

  @override
  void initState() {
    super.initState();

    // print(word) here would throw a runtime error
    word = 'Hello';
  }
}
Run Code Online (Sandbox Code Playgroud)

在初始化之前访问一个字将引发运行时错误。