Flutter自定义按钮传递带BuildContext的回调函数报错
问题根源
你的自定义MyButton组件中,onPressed参数类型是void Function()?(无参、无返回值的可选函数),但你传递的myShowDialog是Future<String?> Function(BuildContext)(需要BuildContext参数、返回Future的函数),两者类型不兼容,导致匹配错误。
两种解决方案
方案1:修改自定义MyButton的参数类型,支持带BuildContext的回调
调整MyButton的onPressed参数定义,让它接收需要BuildContext的函数,内部调用时传入context:
class MyButton extends StatelessWidget { final String text; // 修改参数类型为带BuildContext的函数 final Future<String?> Function(BuildContext)? onPressed; const MyButton({super.key, required this.text, this.onPressed}); @override Widget build(BuildContext context) { return ElevatedButton( // 调用时传入当前context onPressed: onPressed != null ? () => onPressed!(context) : null, child: Text(text), ); } }
使用时直接传递myShowDialog方法引用即可:
MyButton( text: "打开弹窗", onPressed: myShowDialog, )
方案2:调用时用匿名函数包裹,转换为无参回调
如果不想修改MyButton原有定义,就在传递onPressed时,用匿名函数把myShowDialog包装成无参函数,并传入当前context:
MyButton( text: "打开弹窗", onPressed: () => myShowDialog(context), )
这样就把带参的myShowDialog转换成了符合void Function()?要求的无参函数。
为什么TextButton可以正常使用?
你在TextButton中使用时,实际是用匿名函数包裹了myShowDialog(context)(比如onPressed: () => myShowDialog(context)),已经把带参函数转换成了无参的void Function(),所以类型匹配没问题。
内容的提问来源于stack exchange,提问作者Rasputin221
相关产品推荐
相关产品推荐

