Flutter中Dart变量前加late关键字与类型后加?标记有什么区别?
Dart中
late String id和String? id的区别 这两种写法完全不等价,核心区别如下:
- 空安全性逻辑不同
String? id明确声明该变量为可空类型,合法取值包括String类型字符串和null,可以直接赋值为null,编译器全程允许。late String id声明的是非空类型变量,仅推迟了初始化时机,取值永远不能为null,如果试图给它赋值null,编译器会直接报错。
- 初始化要求不同
String? id声明后不需要主动初始化,默认值就是null,后续可以赋值合法字符串,也可以一直留空。late String id声明时不需要立刻赋值,但必须在第一次访问该变量前给它赋值非空字符串,如果访问时还未初始化,运行时会抛出LateInitializationError异常。
- 使用时的校验要求不同
String? id每次使用前都需要做非空判断,或者用!强制拆包,否则编译器会报错,比如直接调用id.length不被允许,必须写成id?.length或者确认非空后再调用。late String id使用时不需要做非空校验,编译器默认你已经在访问前完成了非空赋值,可以直接调用它的属性和方法。
对比示例
// 可空类型写法 String? id1; print(id1); // 合法,输出null id1 = "123"; print(id1?.length); // 需要加?做非空判断 // late非空写法 late String id2; // print(id2); // 运行时报错,未初始化 id2 = "456"; print(id2.length); // 不需要非空判断,直接调用 // id2 = null; // 编译报错,不能给非空变量赋值null
内容的提问来源于stack exchange,提问作者user11874694
相关产品推荐
相关产品推荐

