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

Flutter调用showDialog报Navigator上下文错误,尝试子组件/Builder仍未解决

解决Navigator上下文缺失问题

问题根源

你调用showDialog时使用的context并未关联到Navigator实例——MaterialApp.router是提供Navigator的顶层组件,而你的BlocListener所在层级的上下文无法访问到这个Navigator。

直接解决方案:使用全局NavigatorKey弹出对话框

既然你已经配置了router.routerDelegate.navigatorKey,直接通过这个key获取NavigatorState即可绕过上下文限制,修改后的SubWidget代码如下:

class SubWidget extends StatelessWidget {
  const SubWidget({super.key, this.child});

  final Widget? child;

  @override
  Widget build(BuildContext context) {
    return UpgradeAlert(
      navigatorKey: router.routerDelegate.navigatorKey,
      child: BlocListener<NetworkBloc, NetworkState>(
        listener: (context, state) async {
          if (state is NetworkFailure) {
            // 通过全局navigatorKey获取NavigatorState
            await router.routerDelegate.navigatorKey.currentState!.showDialog(
              context: router.routerDelegate.navigatorKey.currentContext!,
              builder: (context) {
                return const AlertDialog(
                  title: Text('No Network'),
                );
              },
            );
          }
        },
        child: child,
      ),
    );
  }
}

额外优化:避免重复弹窗

添加listenWhen条件,防止网络状态频繁切换时重复弹出相同对话框:

BlocListener<NetworkBloc, NetworkState>(
  // 仅当状态从非失败变为失败时触发
  listenWhen: (previous, current) => previous is! NetworkFailure && current is NetworkFailure,
  listener: (context, state) async {
    // 弹窗代码同上
  },
  child: child,
)

为什么之前的Builder无效?

你添加的Builder仅在UpgradeAlert子节点增加了上下文层级,但该上下文依然处于MaterialApp.router的builder内部,并未关联到Navigator的上下文。使用全局navigatorKey是MaterialApp.router场景下最可靠的弹窗方式。

内容的提问来源于stack exchange,提问作者RayOvO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:35:05