Flutter给按钮Widget传递回调时函数立即执行、按钮禁用是什么原因?
问题根因分析
- 函数提前执行的原因
ElevatedButton的onPressed参数要求接收VoidCallback类型,也就是无参数、无返回值的函数对象。你在MyButton的build逻辑中写的onPressed: onPressed(message),会直接执行你传入的onPressed函数并把message作为入参传入,函数会在组件构建阶段就运行,因此出现按钮还未点击逻辑就触发的现象。 - 按钮禁用的原因
你定义的printString函数没有返回值,执行onPressed(message)后返回的是null,相当于给ElevatedButton的onPressed属性赋值为null,Flutter中onPressed为null时按钮会自动进入禁用状态,和你观察到的线索完全吻合。
你之前在MyApp层传递printString时省略括号的操作是正确的,确实是把函数本身作为对象传递给了MyButton,问题出在MyButton内部使用函数的逻辑错误。
修复方案
只需要把带参数的函数包裹为无参数的VoidCallback即可,修改MyButton中ElevatedButton的onPressed赋值逻辑:
@override Widget build(BuildContext context) { return ElevatedButton( // 用匿名函数包裹,仅在按钮点击时才会执行内部逻辑 onPressed: () => onPressed(message), child: const Text('Press Here'), ); }
如果需要在点击时执行多段逻辑,也可以写为完整函数体形式:
onPressed: () { // 可在此处添加其他点击前的处理逻辑 onPressed(message); },
内容的提问来源于stack exchange,提问作者David Welsh
相关产品推荐
相关产品推荐

