Dart构造函数空安全:未传参pr2为何为null而非默认值str1
问题原因
Dart构造函数使用this.属性名的参数语法糖时,字段声明位置写的初始值不会自动作为构造函数可选参数的默认值,核心规则如下:
- 只要字段被纳入构造函数的
this.xxx参数列表,该字段的初始化逻辑就完全由构造函数参数接管,字段声明时写的初始值会被直接覆盖,不会生效 - 构造函数的可选参数如果没有显式指定默认值,无论对应字段声明时写了什么初始值,未传参时参数的默认值固定为
null(空安全机制下仅可空类型允许该行为)
你的代码里pr2被定义为构造函数的可选命名参数,且没有给这个参数设置默认值,实例化时未传入pr2参数,构造函数就会直接给pr2字段赋值null,覆盖你在字段定义时写的'str1'初始值,最终输出null。
顺带一提,你代码中pr1声明的初始值1、pr3声明的初始值3也属于无效代码:这两个字段是构造函数的必填参数,每次实例化都会被传入的参数值覆盖,永远不会触发字段本身的初始值逻辑。
修复方案
直接在构造函数的参数列表里给可选参数显式指定默认值即可,不需要在字段声明位置重复写无效的初始值:
void main() { var house = Home(pr1: 4, pr3: 5); house.printDate(); } class Home { int pr1; String? pr2; int pr3; // 给this.pr2显式设置默认值'str1' Home({required this.pr1, this.pr2 = 'str1', required this.pr3}); void printDate() { print('The pr1: $pr1'); print('The pr2: $pr2'); print('The pr3: $pr3'); } }
修改后运行,未传pr2参数时会正常输出默认值str1,符合预期。
内容的提问来源于stack exchange,提问作者DenisNos
相关产品推荐
相关产品推荐

