Flutter购物车Bloc初始化报错适配新版flutter_bloc库修复
修复flutter_bloc新版事件未注册错误
新版flutter_bloc(v8及以上版本)已弃用mapEventToState方法,改为通过on<Event>语法注册事件处理器,你的代码仍使用旧写法,导致事件找不到对应处理逻辑,触发报错。
修改后的完整代码如下:
import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:shop_cart/model/shop.dart'; import 'package:shop_cart/repository/shop_data_repository.dart'; part 'shop_event.dart'; part 'shop_state.dart'; class ShopBloc extends Bloc<ShopEvent, ShopState> { final ShopDataProvider shopDataProvider = ShopDataProvider(); ShopBloc() : super(ShopInitial()) { // 注册所有事件处理器 on<ShopPageInitializedEvent>(_onShopPageInitialized); on<ItemAddingCartEvent>(_onItemAddingCart); on<ItemAddedCartEvent>(_onItemAddedCart); on<ItemDeleteCartEvent>(_onItemDeleteCart); // 触发初始化事件 add(ShopPageInitializedEvent()); } // 处理页面初始化事件 Future<void> _onShopPageInitialized( ShopPageInitializedEvent event, Emitter<ShopState> emit, ) async { final shopData = await shopDataProvider.getShopItems(); final cartData = await shopDataProvider.geCartItems(); emit(ShopPageLoadedState(shopData: shopData, cartData: cartData)); } // 处理添加商品到购物车中事件 Future<void> _onItemAddingCart( ItemAddingCartEvent event, Emitter<ShopState> emit, ) async { final cartData = await shopDataProvider.geCartItems(); emit(ItemAddingCartState(cartItems: event.cartItems, cartData: cartData)); } // 处理商品已添加到购物车事件 void _onItemAddedCart( ItemAddedCartEvent event, Emitter<ShopState> emit, ) { emit(ItemAddedCartState(cartItems: event.cartItems)); } // 处理删除购物车商品事件 void _onItemDeleteCart( ItemDeleteCartEvent event, Emitter<ShopState> emit, ) { emit(ItemDeletingCartState(cartItems: event.cartItems)); } }
关键修改点:
- 移除
mapEventToState重写方法,改用on<Event>在构造函数中注册事件处理器 - 将每个事件的处理逻辑拆分为独立私有方法,使用
Emitter<ShopState>替代yield发送状态 - 确保事件处理器注册完成后再触发初始化事件
内容的提问来源于stack exchange,提问作者Pulkit Aggarwal
相关产品推荐
相关产品推荐

