Flutter中如何关闭多个showDialog弹窗?
解决Flutter中关闭所有弹窗后显示新弹窗的问题
你的需求是关闭确认弹窗(_mostrarDialogConfirmacion)和加载弹窗(cargandoDialog),之后只显示消息弹窗(_mostrarDialogMensaje)。当前代码里的Navigator.of(context).pop()仅能关闭栈顶单个弹窗,要确保关闭所有弹窗,可以用以下两种可靠方式实现:
方法1:用Navigator.popUntil关闭所有弹窗
popUntil可以让导航器持续弹出路由,直到满足指定条件。这里我们让它回到根路由,也就是所有弹窗都被关闭的状态,是最通用稳妥的方案:
_mostrarDialogConfirmacion( mensaje, BuildContext context, codLink, motivo, ) { return showDialog( context: context, builder: (context){ return AlertDialog( title: const Text( 'Informacion', textAlign: TextAlign.center, ), content: Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Text(mensaje, textAlign: TextAlign.center), ], ), actions: <Widget>[ TextButton( onPressed: () async { // 关闭当前确认弹窗 Navigator.of(context).pop(); // 打开加载弹窗 cargandoDialog(context); // 执行查询逻辑 List<dynamic> ingresarReclamo1 = await ingresarReclamo .ingresarReclamo(codLink, titular, motivo); // 关闭所有弹窗,回到根路由 Navigator.of(context, rootNavigator: true).popUntil((route) => route.isFirst); // 显示结果弹窗 _mostrarDialogMensaje( ingresarReclamo1[0].observaciones, ingresarReclamo1[0].validado, context, ); }, child: const Text('Si') ), TextButton( onPressed: ()=> Navigator.of(context).pop(), child: const Text('No') ), ], ); } ); }
方法2:根导航器连续弹出(仅确定只有两个弹窗时用)
如果能明确当前导航栈里只有确认、加载这两个弹窗,也可以直接用根导航器连续弹出两次,但这种方式扩展性差,后续新增弹窗后逻辑会失效:
// 替换查询完成后的单个pop为: Navigator.of(context, rootNavigator: true)..pop()..pop();
核心注意点
rootNavigator: true确保操作的是应用根导航器,避免弹窗内部上下文导致的导航失效问题popUntil方案适配性更强,无论后续新增多少弹窗,都能确保清空所有弹窗回到初始状态- 只要
cargandoDialog是通过showDialog打开的,就会被加入导航栈,上述两种方法都能正确关闭它
内容的提问来源于stack exchange,提问作者Agustin Coronel
相关产品推荐
相关产品推荐

