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

Cubit无法从Firestore返回数据:如何修复空列表问题?

修复HomeDecksCubit始终发出空列表的问题

以下是针对问题的具体排查和修复步骤:

  • 先确认数据源是否真的有数据
    核心问题可能出在databaseRepository.userDecksStream()本身没有返回非空数据。先在Repository层调试:

    • 检查数据库查询逻辑,比如是否正确过滤了当前用户、查询条件是否遗漏关键参数;
    • 直接打印Repository返回的Stream初始值,确认数据库中确实存在Deck数据。
  • 移除listen回调中不必要的async修饰符
    原代码中listen回调使用了async但无await操作,可能引发异步调度异常,修改后:

    void fetchHomeDecks() {
      decksSubscription = databaseRepository.userDecksStream().listen((event) {
        log.v(event);
        emit(state.copyWith(decks: event, requested: false));
      });
    }
    
  • 处理Stream初始值为空的情况
    部分Stream不会立即发出数据,可先同步获取一次当前数据再监听后续变化(需Repository提供同步获取方法):

    void fetchHomeDecks() async {
      // 先获取初始数据
      final initialDecks = await databaseRepository.getUserDecks();
      if (initialDecks.isNotEmpty) {
        emit(state.copyWith(decks: initialDecks, requested: false));
      }
      // 监听数据变化
      decksSubscription = databaseRepository.userDecksStream().listen((event) {
        log.v(event);
        emit(state.copyWith(decks: event, requested: false));
      });
    }
    
  • 检查HomeDecksState的copyWith方法正确性
    确认State的copyWith方法是否正确赋值decks参数,避免默认值覆盖传入数据:

    class HomeDecksState {
      const HomeDecksState({required this.decks, required this.requested});
      final List<Deck> decks;
      final bool requested;
    
      HomeDecksState copyWith({
        List<Deck>? decks,
        bool? requested,
      }) {
        return HomeDecksState(
          decks: decks ?? this.decks, // 确保使用传入值或当前状态值,而非默认空列表
          requested: requested ?? this.requested,
        );
      }
    }
    
  • 避免重复订阅导致的异常
    若后续可能多次调用fetchHomeDecks,需先取消之前的订阅(将decksSubscription改为可空类型):

    StreamSubscription<List<Deck>>? decksSubscription;
    
    void fetchHomeDecks() {
      // 取消已有订阅
      decksSubscription?.cancel();
      // 重新订阅
      decksSubscription = databaseRepository.userDecksStream().listen((event) {
        log.v(event);
        emit(state.copyWith(decks: event, requested: false));
      });
    }
    

内容的提问来源于stack exchange,提问作者Sergiy Vergun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:38:26