Dart声明无初始值String变量报错但dynamic类型不报错是什么原因
Dart可空变量声明报错原因说明
核心原因:Dart空安全机制约束
Dart 2.12及以上版本默认启用**空安全(Null Safety)**特性,对非dynamic的显式声明类型的变量默认是不可空类型,编译阶段会强制校验初始化规则:不可空类型变量必须在声明时赋值,否则直接报错。
你遇到的两种声明的差异如下:
String someVar;:声明了不可空的String类型变量,既没有初始化赋值,也没有做可空/延迟初始化标记,完全不符合空安全校验规则,因此编译器直接报错。dynamic someVar;:dynamic属于动态类型,编译器不会对该类型变量做空安全强制校验,允许变量值可以是任意类型(包括null),因此即便不初始化也不会触发编译错误。
官方推荐的合法声明方式(无需使用dynamic)
除了dynamic之外,你可以根据使用场景选择更安全的声明方式:
- 标记为可空类型:在类型后加
?表示变量允许为null,代码为String? someVar; - 延迟初始化:确定变量会在首次使用前赋值,可以用
late关键字标记,代码为late String someVar; - 声明时直接赋值:满足不可空类型的初始化要求,代码为
String someVar = "default value";
内容的提问来源于stack exchange,提问作者Pranav Wankhedkar
相关产品推荐
相关产品推荐

