Flutter自定义按钮点击时无法同时执行传入函数与动画问题
问题解决:Flutter自定义按钮传入的VoidCallback不执行
核心原因是你在按钮内部的回调中没有实际调用传入的widget.onTap函数,只是引用了函数对象,导致回调逻辑没触发。
错误写法分析
- 第一种错误写法:
onTap: () { widget.onTap; // 仅引用函数,未调用 setState(() { _clicked = !_clicked; }); },
这里widget.onTap只是获取了函数对象,没有执行它,所以传入的回调不会运行。
- 第二种数组写法:
onTap: () => [ widget.onTap, // 同样只是把函数对象放入数组,未执行 { setState(() { _clicked = !_clicked; }) } ],
这种写法逻辑错误,数组元素是函数引用时不会自动执行,而且用数组包裹多个操作的方式本身不适合这里。
正确写法
需要主动调用widget.onTap,同时建议加判空处理(防止未传入onTap时触发空指针异常):
onTap: () { // 调用传入的回调函数,?.call() 确保为空时不执行 widget.onTap?.call(); setState(() { _clicked = !_clicked; }); },
如果能保证onTap永远不为null,也可以直接写:
widget.onTap();
额外注意
你的使用代码里有个小笔误,onTap = () {应该改成onTap: () {(用冒号而不是等号),否则会导致语法错误:
MyButton( onTap: () { // 这里是冒号,不是等号 print(_isSelected); setState(() { _isSelected[0] = !_isSelected[0]; }); }, )
内容的提问来源于stack exchange,提问作者Davinci Cake
相关产品推荐
相关产品推荐

