使用不包含 Bloc 类型的上下文调用 BlocProvider.of()

Posted

技术标签:

【中文标题】使用不包含 Bloc 类型的上下文调用 BlocProvider.of()【英文标题】:BlocProvider.of() called with a context that does not contain a Bloc of type 【发布时间】:2020-10-25 02:31:45 【问题描述】:
@override
  Widget build(BuildContext context) 
    return MultiBlocProvider(
    providers: [
         BlocProvider<TripDetailBloc>(create: (BuildContext context) => TripDetailBloc()),
         BlocProvider<PopUpBloc>(create: (BuildContext context) => PopUpBloc()),
               ],
    child: Scaffold(
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () 
          BlocProvider.of<TripDetailBloc>(context).add(AddTripDetailPannelEvent());
        ,
      ),
      appBar: appbar(),
      body: pannel(),
    )
    );
  

在处理手势时抛出以下断言:

TripDetailBloc。 从传递给的上下文中找不到祖先 BlocProvider.of&lt;TripDetailBloc&gt;(). 如果您使用的上下文来自 BlocProvider。 他使用的上下文是:TripDetailPage(dependencies: [MediaQuery], 状态:_TripDetailPageState#d4ab3)

【问题讨论】:

【参考方案1】:

将您的代码更改为:

Widget build(BuildContext context) 
  
  return MultiBlocProvider(
      providers: [
        BlocProvider<TripDetailBloc>(create: (BuildContext context) => TripDetailBloc()),
        BlocProvider<PopUpBloc>(create: (BuildContext context) => PopUpBloc()),
      ],
      child: Builder(
        builder: (context) 
          return Scaffold(
            floatingActionButton: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () 
                BlocProvider.of<TripDetailBloc>(context).add(AddTripDetailPannelEvent());
              ,
            ),
            appBar: appbar(),
            body: pannel(),
          );
        
      )
  );

如果您仔细观察,我已将您的 Scaffold 敲击成一个小部件构建器。

【讨论】:

谢谢伙计,它对我有用。不过很奇怪,如果您想直接从子小部件访问而不在中间创建任何构建方法,我猜提供者无法访问上下文。【参考方案2】:

将您的脚手架包装在构建器小部件中并使用该上下文。 .of(context) 使用的上下文与方法 build(BuildContext context) 相同,这就是它找不到它的原因

【讨论】:

以上是关于使用不包含 Bloc 类型的上下文调用 BlocProvider.of()的主要内容,如果未能解决你的问题,请参考以下文章

使用不包含 Bloc 类型的上下文调用 BlocProvider.of()

BlocProvider.of() 使用不包含 Bloc<dynamic,dynamic> 类型的 Bloc 的上下文调用

使用不包含 PhoneAuthenticationBloc 类型的 Bloc 的上下文调用 BlocProvider.of()。扑

使用不包含 Bloc 类型的上下文调用 Flutter BlocProvider.of()

BlocProvider.of() 调用的上下文不包含 MyBloc 类型的 Bloc/Cubit

使用 bloc 更改屏幕