Flutter中IconButton的onPressed方法为何在状态初始化时自动调用
问题根因
你遇到的报错和方法自动执行的问题,核心是IconButton的onPressed参数赋值逻辑错误:
onPressed要求接收的是一个VoidCallback类型的函数引用,只有当用户主动点击按钮时,Flutter才会执行这个引用指向的函数- 你代码中写的是
onPressed: widget.onClose(),末尾的括号代表你会在这行代码被执行时立即调用widget.onClose方法,而不是把它作为回调绑定给点击事件 - 这行代码是在
MyFloatingWidget的build流程中运行的,此时组件还没完成构建,调用onClose触发父组件setState发起新一轮构建,就会抛出setState() or markNeedsBuild() called during build的错误。
修复方法
只需要修改onPressed的赋值,传递函数引用而非直接执行函数即可,有两种常用写法:
- 直接传入函数本身,去掉末尾的括号:
return IconButton( onPressed: widget.onClose, icon: Icon(Icons.close) );
- 用匿名函数包裹(适用于需要给回调传参的场景):
return IconButton( onPressed: () { widget.onClose(); }, icon: Icon(Icons.close) );
注意事项
Flutter中所有事件回调参数(比如onTap、onChanged、onSubmitted等)都遵循这个规则:
- 赋值时加括号,会在组件build阶段立即执行函数
- 赋值时不加括号,才是把函数作为回调绑定给事件,触发事件时才会执行
- 如果回调需要携带自定义参数,必须用匿名函数包裹后再传入,避免执行时机错误
内容的提问来源于stack exchange,提问作者12pm
相关产品推荐
相关产品推荐

