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

Flutter构造函数可选参数报错求助:参数不可为null但默认值为null

解决Flutter ReusableCard可选参数cardChild的空安全报错

问题原因

你定义的cardChild是非空的Widget类型,但构造函数里它是可选参数,未传入时默认值为null,这违反了Dart的空安全规则,导致报错。

三种可行解决方案

方案1:将cardChild声明为可空类型

把cardChild的类型改为Widget?(可空Widget),这样它可以接受null值:

class ReusableCard extends StatelessWidget {
  ReusableCard({required this.colour, this.cardChild});

  final Color colour;
  final Widget? cardChild; // 改为可空类型

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.all(15.0),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10.0),
        color: colour,
      ),
      child: cardChild, // 可空类型直接使用即可
    );
  }
}

方案2:给cardChild设置默认值

如果希望cardChild始终是非空的,可以给它指定一个默认Widget(比如空容器),这样即使不传参数也不会为null:

class ReusableCard extends StatelessWidget {
  // 给cardChild设置默认值
  ReusableCard({required this.colour, this.cardChild = const SizedBox()});

  final Color colour;
  final Widget cardChild; // 保持非空类型

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.all(15.0),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10.0),
        color: colour,
      ),
      child: cardChild,
    );
  }
}

方案3:将cardChild设为必填参数(按需选择)

如果业务上要求每个ReusableCard都必须有子组件,直接把cardChild设为required:

class ReusableCard extends StatelessWidget {
  ReusableCard({required this.colour, required this.cardChild});

  final Color colour;
  final Widget cardChild;

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.all(15.0),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10.0),
        color: colour,
      ),
      child: cardChild,
    );
  }
}

内容的提问来源于stack exchange,提问作者Sanjeev Chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:35:20