MultiBlocProvider 未实例化所有 bloc 提供程序 - 如何正确使用 MultiBlocProvider?

Posted

技术标签:

【中文标题】MultiBlocProvider 未实例化所有 bloc 提供程序 - 如何正确使用 MultiBlocProvider?【英文标题】:MultiBlocProvider not instantiating all bloc providers - how to properly work with MultiBlocProvider? 【发布时间】:2020-10-06 19:36:57 【问题描述】:

我正在使用 flutter_bloc 并利用 MultiBlocProvider 小部件。一切正常,然后在某个时候,我的 MultiBlocProvider 只是拒绝实例化我创建并添加到其中的任何新 Bloc。我对 flutter_bloc 很陌生,所以任何指针都会有所帮助。

从下面的示例中,我在此问题之前有 ItemListsBloc 和 CartBloc,并且它们继续正确实例化。这里的问题是 LoadFaves 集团,以及我尝试添加的任何其他新集团。

任何帮助将不胜感激。

这是我的 MultiBlocProvider:

 @override
  Widget build(BuildContext context) 
    return MultiBlocProvider(
      providers: [
        BlocProvider(
          create: (context) => ItemListsBloc()..add(LoadItemLists()),
        ),
        BlocProvider(
          create: (context) =>
              FaveBloc()..add(LoadFaves('3pujK2EPXFaIPue3F42kSMTLgDV2')),
        ),
        BlocProvider(
          create: (context) => CartBloc()..add(CartInitialize()),
        ),
      ],
      child: BlocBuilder<ItemListsBloc, ItemListsState>(
        builder: (context, state) 
          if (state is ItemListsLoaded) 
            return Column(children: [
              Categories(items: state.items.values.toList()),
              SizedBox(
                height: 10.0,
              ),
              Expanded(
                child: ListView(
                  shrinkWrap: true,
                  children: _buildItemLists(state.itemLists, state.items),
                ),
              )
            ]);
          

          return Container();
        ,
      ),
    );
  

这里是“有问题的”集团:

class FaveBloc extends Bloc<FaveEvent, FaveState> 
  final FavesRepository _favesRepository = FavesRepository.instance;
  StreamSubscription _favesSubscription;

  @override
  FaveState get initialState => FaveInitial();

  @override
  Stream<FaveState> mapEventToState(
    FaveEvent event,
  ) async* 
    if (event is LoadFaves) 
      yield* _mapLoadFavesToState(event);
     else if (event is UpdateFaves) 
      yield* _mapUpdateFavesToState(event);
    
  

  Stream<FaveState> _mapLoadFavesToState(LoadFaves event) async* 
    _favesSubscription?.cancel();
    _favesSubscription = _favesRepository.faves(event.userId).listen(
          (faves) => add(UpdateFaves(faves)),
        );
  

  Stream<FaveState> _mapUpdateFavesToState(UpdateFaves event) async* 
    yield FavesUpdated(event.faves);
  

class OrderBloc extends Bloc<OrderEvent, OrderState> 
  final OrderRepository _orderRepository = OrderRepository.instance;
  StreamSubscription _ordersSubscription;
  StreamSubscription _currOrderSubsction;

  @override
  OrderState get initialState => OrdersUnitialized();

  @override
  Stream<OrderState> mapEventToState(
    OrderEvent event,
  ) async* 
    if (event is OrderCreated) 
      yield* _mapOrderCreatedToState(event);
     else if (event is OrdersUpdated) 
      yield* _mapOrderUpdateToState(event);
     else if (event is OrderLoadRequest) 
      yield* _mapLoadReqToState();
    
  

  Stream<OrderState> _mapLoadReqToState() async* 
    _ordersSubscription?.cancel();
    _ordersSubscription = _orderRepository.orders().listen(
          (orders) => add(OrdersUpdated(orders)),
        );
  

  Stream<OrderState> _mapOrderCreatedToState(OrderCreated event) async* 
    var orderId = await _orderRepository.createNewOrder(event.order);

    var state = this.state as OrdersLoadSuccess;

    yield state.copyWith(currentOrderId: orderId);
  

  Stream<OrderState> _mapOrderUpdateToState(OrdersUpdated event) async* 
    yield OrdersLoadSuccess(orders: event.orders);
  

  @override
  Future<void> close() 
    _ordersSubscription?.cancel();
    _currOrderSubsction?.cancel();
    return super.close();
  

非常感谢您

【问题讨论】:

【参考方案1】:

默认情况下,块由 BlocProvider 延迟创建,这意味着在通过 BlocProvider.of(context) 查找块之前不会调用 create。您可以在 BlocProvider 上将 lazy 设置为 false 以强制立即创建 bloc。

BlocProvider(
  lazy: false,
  create: (_) => MyBloc(),
  child: MyChild(),
)

来自菲利克斯 A。

【讨论】:

以上是关于MultiBlocProvider 未实例化所有 bloc 提供程序 - 如何正确使用 MultiBlocProvider?的主要内容,如果未能解决你的问题,请参考以下文章

在“MultiBlocProvider”中使用“BlocBuilder”时出现错误

Flutter 在 MultiBlocProvider 中使用 BlocListener 和 BlocBuilder

java.lang.RuntimeException:无法实例化接收器(未找到类)

Flutter MultiBlocProvider 性能

如何解决在 NestJs 应用程序中应该是 Injectable 类的未实例化属性?

@RestControllerAdvice 未实例化