MultiBlocProvider не создает экземпляры всех поставщиков blo c - как правильно работать с MultiBlocProvider? - PullRequest
1 голос
/ 17 июня 2020

Я использую flutter_blo c и использую виджет MultiBlocProvider. Все работало нормально, а затем в какой-то момент мой MultiBlocProvider просто отказался создавать экземпляры любых новых блоков, которые я создал и добавил к нему. Я новичок в flutter_blo c, поэтому мне помогут любые указатели.

Из моего примера ниже у меня были ItemListsBlo c и CartBlo c до этой проблемы, и они продолжают правильно создаваться. Проблема здесь в блоке LoadFaves c и в любых других новых блоках, которые я пытался добавить.

Любая помощь приветствуется.

Вот мой 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();
        },
      ),
    );
  }

А вот блоки "проблемати c":

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 Ответ

1 голос
/ 17 июня 2020

По умолчанию блоки создаются BlocProvider лениво, что означает, что create не будет вызываться до тех пор, пока блок c не будет найден через BlocProvider.of (context). Вы можете установить lazy в значение false в BlocProvider, чтобы блоки создавались немедленно.

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

От Феликса А.

...