Flutter中PopScope调用Cubit报错:无法找到正确的Bloc Provider
问题分析
你遇到的错误核心原因是:当前使用的context无法访问到MultiBlocProvider提供的Cubit。PopScope是MultiBlocProvider的父Widget,onPopInvoked回调里的context属于PopScope层级,这个层级在MultiBlocProvider之上,自然找不到子树中提供的Provider。
解决方案
方案1:调整Widget层级(推荐)
把MultiBlocProvider放在PopScope外面,让PopScope的context能覆盖到Provider的范围:
MultiBlocProvider( providers: [ BlocProvider( create: (context) => ChatCubit( locator(), locator(), ), ), BlocProvider( create: (context) => IsTypingCubit(), ), ], child: PopScope( canPop: false, onPopInvoked: (bool val) async { back(context); // 传入能访问到Provider的context }, child: child... ), )
同时修改back函数,接收context参数:
void back(BuildContext context) { final emojiController = locator<EmojiController>(); if (emojiController.emojiShowing) { emojiController.stopShowingEmoji(); } else { context.read<ChatCubit>().onBackButtonOnChatPage(); context.read<IsTypingCubit>().sendUserStoppedTyping(); } context.pop(); }
方案2:用Builder获取子树context(不调整层级时使用)
如果不想改动原有层级结构,可以通过Builder获取MultiBlocProvider子树的context:
PopScope( canPop: false, onPopInvoked: (bool val) async { // 用Builder获取子树的context,该context能访问到Provider Builder( builder: (innerContext) { back(innerContext); return const SizedBox.shrink(); }, ); }, child: MultiBlocProvider( providers: [ BlocProvider( create: (context) => ChatCubit( locator(), locator(), ), ), BlocProvider( create: (context) => IsTypingCubit(), ), ], child: child... ), )
同样需要修改back函数,接收传入的innerContext参数。
内容的提问来源于stack exchange,提问作者Ardeshir ojan
相关产品推荐
相关产品推荐

