如何从CoolAlert弹窗返回上一页并传递值?
Flutter中cool_alert弹窗的常见问题解答
问题1:成功显示弹窗后,如何返回上一页并传递值?
要实现该需求,需在弹窗的确认按钮回调中先关闭弹窗,再关闭当前页面并传递值。因为CoolAlert.show本质是打开一个新的路由弹窗,需分两步操作:
_coolAlert(BuildContext context) { CoolAlert.show( context: context, type: CoolAlertType.success, text: "Your transaction was successful!", onConfirmBtnTap: () { // 第一步:关闭cool_alert弹窗 Navigator.pop(context); // 第二步:返回上一页并传递值 Navigator.pop(context, true); }, ); }
上一页可通过await Navigator.push(...)接收该返回值。
问题2:调用_coolAlert后立刻执行Navigator.pop(context, true),为什么弹窗不显示?
核心原因如下:
CoolAlert.show是异步Future方法,需要时间完成弹窗渲染和路由入栈操作,你紧接着执行的Navigator.pop(context, true)会直接关闭当前页面路由,弹窗还未渲染就被销毁。CoolAlert.show会在当前路由栈中新增一个弹窗条目,你调用的Navigator.pop(context, true)是关闭当前页面的路由,相当于直接把包含弹窗的整个页面路由从栈中移除,自然看不到弹窗。
问题3:修改_coolAlert为如下写法后,为什么上一页接收的值为null?
你提供的代码存在语法和逻辑错误:
// 错误写法 _coolAlert(BuildContext context) { CoolAlert.show( context: context, type: CoolAlertType.success, text: "Your transaction was successful!", onConfirmBtnTap: () { debugPrint('success'); }, Navigator.pop(context, true); // 非法代码 ); }
- 直接在
CoolAlert.show的参数列表中写Navigator.pop(context, true);属于语法错误,这行代码会在弹窗初始化时立刻执行,而非用户点击确认按钮时触发。 - 这会导致弹窗还未显示,当前页面就被提前关闭,上一页无法收到正确的传递值,因此拿到的是
null。正确做法是将Navigator.pop逻辑放在onConfirmBtnTap回调内部,参考问题1的写法。
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

