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:无法实例化接收器(未找到类)