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

What is the difference between using `late` keyword before the variable type or using `?` mark after the variable type it in the Flutter?

我认为在新的 Dart 规则中变量不能 declared/initialized 为 null。所以我们必须在变量类型之前加上一个 late 关键字,如下所示:

late String id;

或在变量类型后加一个 ? 标记,如下所示:

String? id;

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

当你使用 late 关键字时,当你用 ? 调用它时,你不能让变量未初始化。允许您在创建变量并调用它时让变量未初始化

可空变量在使用前不需要初始化。

默认初始化为null:

void main() {
  String? word;
  
  print(word); // prints null
}

关键字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';
  }
}

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

null 安全规则并不意味着您不能使用 null。你可以,但你应该通过添加“?”来表明变量可能具有空值。到它的类型声明。

通过 use 关键字 late 表示变量具有不可为 null 的类型,尚未初始化,但稍后会初始化。 如果尝试在初始化之前访问延迟变量的值,则会抛出异常。