Flutter新版本通过类构造函数传递Function参数出现类型报错如何解决?
问题原因
这个报错是新版Flutter强类型校验带来的,核心有两个不匹配:
Checkbox组件的onChanged参数要求的函数类型是void Function(bool?)?,接收一个可空布尔值作为入参,而你在TaskCheckbox中声明的toggleCheckboxstate是无签名限制的通用Function类型,类型不匹配。- 你定义的
checkboxCallBack入参是不可空的bool类型,和onChanged要求的bool?可空入参也不匹配。
解决步骤
按以下方案修改即可,两种方案二选一:
方案一:全链路适配Flutter官方参数规范
- 明确
TaskCheckbox中回调函数的类型签名
将原来的属性声明修改为明确的函数类型,匹配Checkbox的参数要求:
// TaskCheckbox 类 final bool checkboxState; // 明确指定函数接收可空bool参数,无返回值 final void Function(bool?) toggleCheckboxstate;
- 调整你自己的回调函数适配可空参数
修改TasksTile中的checkboxCallBack,增加空值判断逻辑:
// TasksTile 类 void checkboxCallBack(bool? checkboxState) { // 仅当参数不为空时更新状态 if (checkboxState != null) { setState(() { isChecked = checkboxState; }); } }
方案二:保留原有回调逻辑,仅在Checkbox赋值处做参数转换
如果不想修改原有回调的参数类型,可以选择在Checkbox赋值处做一层参数转换:
// TaskCheckbox 类的build方法 @override Widget build(BuildContext context) { return Checkbox( activeColor: Colors.lightBlueAccent, value: checkboxState, // 包装一层做非空判断后再调用你的回调 onChanged: (val) => val != null ? toggleCheckboxstate(val) : null, ); }
这种情况下toggleCheckboxstate的类型可以声明为final void Function(bool) toggleCheckboxstate;,和你原有回调的签名保持一致即可。
内容的提问来源于stack exchange,提问作者Abdullah Bahattab
相关产品推荐
相关产品推荐

