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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:52:12