Dart中Alert组件回调方法提前执行问题咨询
问题原因与修复方案
问题根源
你遇到的回调提前执行,是两个细节错误导致的:
- 调用时直接执行了函数:你写
callBack(context)的时候,相当于立刻执行这个函数并把返回值传给辅助方法,而不是传递函数本身。所以弹窗还没显示,callBack里的代码就先跑了。 - 辅助方法里未正确调用回调:你的
onPressed回调里只写了f;,这只是引用函数对象,并没有执行它,就算传对了函数,点击OK也不会触发逻辑。
修复步骤
- 修正调用方式
把调用时的第三个参数改成匿名函数,这样传递的是一个待执行的函数引用,而非立即执行的结果:
basicAlertWithOkWithCallback('Session sucessfully saved.', context, () => callBack(context));
- 修正辅助方法的回调调用
在onPressed里要主动调用传递过来的函数,把f;改成f();:
basicAlertWithOkWithCallback(String message, BuildContext context, void Function() f){ showDialog( context: context, builder: (context) => AlertDialog( content: Text(message), actions: <Widget>[ TextButton( child: const Text('OK'), onPressed: () async { f(); // 调用传递的回调函数 }, ), ], ), ); }
额外说明
如果你的callBack方法不需要外部参数(比如context可以通过其他方式获取),也可以直接传递函数名(不带括号),比如basicAlertWithOkWithCallback(..., callBack),但当前场景下callBack需要context,用匿名函数包裹是最稳妥的写法。
内容的提问来源于stack exchange,提问作者RJB
相关产品推荐
相关产品推荐

