You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bloc管理状态报错:'void'类型值无法使用问题求助

解决Bloc状态管理中的"This expression has a type of 'void' so its value can't be used"错误

错误原因

  1. List.add()的返回值问题:hostelList.add(event.hostel)方法的返回类型是void,但FavouriteUpdated构造函数需要接收List<HostelModel>类型的参数,直接传递这个方法的返回值会触发类型不匹配错误。
  2. 状态无法累积:当前代码每次添加收藏时都会新建空列表,导致之前的收藏数据丢失,无法维护连续的状态。

修复方案

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:39:57