Flutter报错Expected a value of type 'Widget' but got type 'Null'求助
问题排查:Flutter红屏报错Expected a value of type 'Widget', but got one of type 'Null'
报错原因
- Mission类构造逻辑错误:虽然类属性
secondWidget、secondDescription声明时设置了默认初始值,但构造函数的可选命名参数未设置默认值,当创建Mission实例时如果没有传入这两个参数,构造函数的赋值操作会直接将属性覆盖为null,原有默认值不会生效。 - 卡片组件渲染逻辑不符合空安全要求:
MultipleTextMissionCard组件中secondWidget、secondDescription未指定可空类型,且build方法中直接将可能为null的变量放入Widget树渲染,Flutter要求Widget树节点必须为非空的Widget类型,变量为null时就会触发类型不匹配报错。
解决方案
- 修正Mission类构造函数,采用Dart更简洁的初始化语法,同时给可选参数设置默认值,避免属性被覆盖为null:
// 修正后的Mission构造函数 Mission(this.missionNumber, this.missionName, this.description, this.points, this.widget,{ this.userPoints = 0, this.secondWidget = const Text("REPLACE THIS TEXT BY YOUR Second WIDGET"), this.secondDescription = "", });
- 修正
MultipleTextMissionCard组件的变量声明和渲染逻辑,适配空安全规则:- 给可选属性指定可空类型
- 渲染时做空判断,值为null时不渲染或者渲染默认占位Widget
class MultipleTextMissionCard extends StatelessWidget { const MultipleTextMissionCard({Key? key, required this.missionNumber, required this.missionName, required this.description, required this.points, required this.widget, this.secondDescription, this.secondWidget }) : super(key: key); final String missionNumber; final String missionName; final String description; final List<int> points; final Widget widget; final String? secondDescription; // 指定可空类型 final Widget? secondWidget; // 指定可空类型 @override Widget build(BuildContext context) { return Card( elevation: 10, child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text(missionNumber), Text(missionName,style: TextStyle( fontSize: 20 ) ), Text("0/${points.last}"), ], ), const SizedBox(height: 5,), Text(description), widget, // 空判断后再渲染 if (secondDescription != null) Text(secondDescription!), if (secondWidget != null) secondWidget!, ] ), ); } }
内容的提问来源于stack exchange,提问作者Chevelev Philippe
相关产品推荐
相关产品推荐

