Flutter类构造函数Null安全问题:Function无法匹配onPressed参数类型
解决Flutter中Function无法赋值给void Function()?的问题
嘿,我完全懂你作为Flutter新手在null safety规则下碰壁的烦躁!这个报错的核心是函数类型不匹配,咱们一步步把它搞定:
问题根源
MaterialButton的onPressed参数要求的是void Function()?类型——也就是「无输入参数、返回值为void的函数,且允许为null」,但你声明的navi是泛型的Function类型。在null safety的严格类型检查下,Flutter没法确认这个泛型函数是否完全符合onPressed的签名要求,所以直接抛出了类型不兼容的错误。
修复方案
我们只需要把navi的类型明确指定为VoidCallback(Flutter内置的类型别名,等价于void Function())就行。因为你的构造函数里navi是required必填项,所以直接用非空的VoidCallback类型就可以:
修改后的完整RoundedButton代码:
class RoundedButton extends StatelessWidget { final Color? color; final String? text; final VoidCallback navi; // 替换原来的Function类型 RoundedButton({super.key, this.color, this.text, required this.navi}); @override Widget build(BuildContext context) { return Padding( padding: EdgeInsets.symmetric(vertical: 16.0), child: Material( color: color!, borderRadius: BorderRadius.all(Radius.circular(30.0)), elevation: 5.0, child: MaterialButton( onPressed: navi, // 现在类型完全匹配,不会报错 minWidth: 200.0, height: 42.0, child: Text(text!), ), ), ); } }
额外小提示
VoidCallback是Flutter官方定义的便捷别名,源码是typedef VoidCallback = void Function();,你也可以直接写final void Function() navi;,效果完全一致。- 另外,我把你原来的
late关键字改成了final——对于StatelessWidget的成员变量,用final更符合Flutter的不可变组件设计原则,避免不必要的可变状态风险。
这样修改后,你的按钮点击逻辑就能正常运行,那个烦人的类型错误也会消失啦!
内容的提问来源于stack exchange,提问作者Minki Jung
相关产品推荐
相关产品推荐

