You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:36:26