最近我遇到了这个问题,但我不知道它在哪里。我得到了这个错误。参数类型'dynamic Function(bool)?'不能分配给参数类型'void函数(bool?)?'
我哪里出错了?
class GroceryTile extends StatelessWidget {
GroceryTile({Key? key, required this.item, required this.onComplete})
: textDecoration = item.isComplete != null
? TextDecoration.lineThrough
: TextDecoration.none,
super(key: key);
final GroceryItem item;
final Function(bool) onComplete;
final TextDecoration textDecoration;
@override
Widget build(BuildContext context) {
return Container(
height: 100.0,
// TODO: 20 Replace this color
color: Colors.red,
);
}
Widget buildCheckbox() {
return Checkbox(
value: item.isComplete,
onChanged: **onComplete** //error is occurring here
);
}
}
final void Function(bool?)? onComplete
Checkbox是一个void函数,所以你也应该在你的OnComplete声明中加上void,如果你不使用nullsafety,只要删除这个符号?
成员onComplete的类型为
void Function(bool)
必须是
void Function(bool?)
必须能够处理空参数
发生错误是因为复选框onChanged方法需要一个函数(bool?)?但是你已经提供了一个动态函数(bool)?。void Function(bool?)?
表示复选框onChanged的值方法可以是null或者一个带空参数的函数。
简单地改变你的onChange的签名方法将修复此问题。
final void Function(bool?) onComplete;
最好检查这类错误的文档,找出正确的函数签名。
如果您从阅读《Flutter Apprentice》一书中键入此代码,您可能希望将final Function(bool) onComplete;
替换为书中的内容,即final Function(bool?)? onComplete;
我们在这里看到的问号是Dart允许变量为空的符号。最外面的问号Function()? onComplete
表示onComplete
函数可能为空。最里面的问号Function(bool?)
表示调用参数可以是布尔值,也可以是空值。
这个null保护也存在于JavaScript和TypeScript中。请看FreeCodeCamp的文章:https://www.freecodecamp.org/news/how-the-question-mark-works-in-javascript/