使用Bloc管理状态报错:'void'类型值无法使用问题求助
解决Bloc状态管理中的"This expression has a type of 'void' so its value can't be used"错误
错误原因
List.add()的返回值问题:hostelList.add(event.hostel)方法的返回类型是void,但FavouriteUpdated构造函数需要接收List<HostelModel>类型的参数,直接传递这个方法的返回值会触发类型不匹配错误。- 状态无法累积:当前代码每次添加收藏时都会新建空列表,导致之前的收藏数据丢失,无法维护连续的状态。
修复方案
修改FavouriteBloc中的事件处理逻辑,从当前状态读取已有收藏列表,创建列表副本并更新后再emit新状态:
class FavouriteBloc extends Bloc<FavouriteEvent, FavouriteState> { FavouriteBloc() : super(FavouriteInitial()) { on<AddToFavorites>((event, emit) { // 获取当前状态中的收藏列表,初始状态则用空列表 final currentList = state is FavouriteUpdated ? (state as FavouriteUpdated).hostelList : []; // 创建列表副本并添加新数据(保持状态不可变性) final updatedList = List<HostelModel>.from(currentList)..add(event.hostel); // 传递更新后的列表到新状态并emit emit(FavouriteUpdated(updatedList)); }); on<RemoveFromFavorites>((event, emit) { // 移除逻辑同理,先获取当前列表再创建副本修改 final currentList = state is FavouriteUpdated ? (state as FavouriteUpdated).hostelList : []; final updatedList = List<HostelModel>.from(currentList)..remove(event.hostel); emit(FavouriteUpdated(updatedList)); }); } }
关键说明
- 从当前状态读取已有列表,确保收藏数据可以持续累积。
- 使用
List.from()创建列表副本,避免直接修改原状态中的列表(违反Bloc状态不可变性原则,会导致UI无法正确更新)。 - 先完成列表的添加/移除操作,再将完整的列表传递给状态构造函数,彻底避免传递
void类型值的问题。
内容的提问来源于stack exchange,提问作者Zawiyar Khan
相关产品推荐
相关产品推荐

