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
相关产品推荐
相关产品推荐

