You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter对话框跳转时自动关闭上一个对话框

解决方法

Flutter 里的对话框本质是压入 Navigator 路由栈的独立弹窗路由,你现在的写法是直接在当前弹窗的路由上面叠一层新路由,旧弹窗当然会留在栈里关不掉。
要实现点Continue就关当前弹窗、开新弹窗的效果,有两种常用写法:

方案1:先关当前弹窗,再弹新弹窗

直接改WelcomeDialog里Continue按钮的点击回调就行,先调Navigator.pop(context)把当前欢迎弹窗关掉,再执行新弹窗的展示逻辑:

// 仅修改原OutlinedButton的onPressed部分即可
onPressed: () {
  // 关闭当前WelcomeDialog
  Navigator.pop(context);
  // 弹出CommonDialog
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return const CommonDialog();
    },
  );
},

这种写法最简单,所有Flutter版本都能兼容,不需要改其他代码。

方案2:直接替换当前弹窗路由(无动画断层)

要是觉得先关再开的两段动画衔接不流畅,可以直接把栈顶的当前弹窗路由替换成新弹窗的路由,不用单独写pop,动画过渡更自然:

onPressed: () {
  Navigator.of(context).pushReplacement(
    DialogRoute(
      context: context,
      builder: (context) => const CommonDialog(),
    ),
  );
},

注意:DialogRoute是Flutter 2.0+ 自带的标准弹窗路由类,和showDialog默认用的路由类型完全一致,不会出现样式差异。


改完之后点Continue,旧的欢迎弹窗会被直接移除,屏幕上只会留新打开的通用弹窗,原来CommonDialog里Cancel按钮的关闭逻辑不用动,点了就能正常回到主页面。

内容的提问来源于stack exchange,提问作者I. Antonov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:01:13