显示带有 Auto_Route 和 BlocListener 的对话框

问题描述 投票:0回答:2

我正在开发一个应用程序,每次用户关闭设备的 Wifi 和移动数据时都会显示警报。我还使用 Auto_Route 进行导航。

这是到目前为止的代码:

class AppWidget extends StatelessWidget {
  AppWidget({super.key});
  final GlobalKey<ScaffoldMessengerState> messengerKey = GlobalKey<ScaffoldMessengerState>();
  @override
  Widget build(BuildContext context) {
    return RepositoryProvider(
      create: (_) => getIt<CPlusNetworkRepository>(),
      child: BlocProvider(
          create: (_) => getIt<ConnectionStatusBloc>()
          ..add(const StreamSubsricptionRequested()),
          child: BlocListener<ConnectionStatusBloc, ConnectionStatusState>(
             listener: (context, state) {
                state.map(
                  connected: (_) {},
                  disconnected: (_) async {
                    WidgetsBinding.instance.addPostFrameCallback((_) async{
                       await showCupertinoDialog(
                         context: context,
                         builder: (context) => const CupertinoAlertDialog(
                           title: Text('Alert'),
                           content: Text('Please switch on Wifi/Mobile Data'),
                         ),
                       );
                    });
                  },
                  unknown: (_) {},
                );
             },
          child: MaterialApp.router(  
             scaffoldMessengerKey: messengerKey,
             routeInformationParser: appRouter.defaultRouteParser(),
             routerDelegate: appRouter.delegate(),
          ),
        ),
      ),
    );
  }
}

我收到此错误:

E/flutter ( 9910): [错误:flutter/runtime/dart_vm_initializer.cc(41)] 未处理的异常:使用不包含导航器的上下文请求导航器操作。

E/flutter ( 9910):用于从导航器推送或弹出路由的上下文必须是导航器小部件的后代小部件的上下文。

我知道我想做的事情本质上是错误的,但我似乎找不到正确的方法来解决这个问题。

有什么建议吗?

提前致谢。

flutter dialog bloc
2个回答
1
投票

您正在尝试显示一个对话框,这需要将

Navigator
放置在小部件树中它之前的任何位置。 解决方案是将听者放在您的
Material
下方,这样它就可以在他的
Navigator
 中找到 
BuildContext


0
投票

如果使用 Auto_route,则在 showDialog() 内部使用此属性:

useRootNavigator: false,

您的代码将是:

await showCupertinoDialog(
                     context: context,
                     useRootNavigator: false,
                     builder: (context) => const CupertinoAlertDialog(
                       title: Text('Alert'),
                       content: Text('Please switch on Wifi/Mobile Data'),
                     ),
                   );
© www.soinside.com 2019 - 2024. All rights reserved.