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

Flutter中StreamBuilder从Firestore返回空列表的问题求助

问题:Firestore获取自定义模型列表返回空集合(集合内存在文档)

我是Flutter新手,尝试从Firestore的residences集合获取自定义模型ResidenceModel列表,但返回空列表,而集合中实际存在一个文档。相关代码如下:

StreamTransformer代码

static StreamTransformer<QuerySnapshot<Map<String, dynamic>>, List<T>>
  transformer<T>(T Function(Map<String, dynamic> json) fromJson) =>
      StreamTransformer<QuerySnapshot<Map<String, dynamic>>,
          List<T>>.fromHandlers(
        handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
          final snaps = data.docs
              .map((doc) => doc.data() as Map<String, dynamic>)
              .toList();
          final residences = snaps.map((json) => fromJson(json)).toList();

          sink.add(residences);
        },
      );

Stream代码

static Stream<List<ResidenceModel>> getResidences() {
return FirebaseFirestore.instance
    .collection('residences')
    .orderBy(ResidencesField.updatedAt, descending: true)
    .snapshots()
    .transform(Utils.transformer(ResidenceModel.fromJson));
}

StreamBuilder代码

return StreamBuilder<List<ResidenceModel>>(
    stream: ResidenceModel.getResidences(),
    builder: (context, AsyncSnapshot<List<ResidenceModel>> snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Center(
          child: CircularProgressIndicator.adaptive() ,
        );
      }
      if (snapshot.data == null || snapshot.hasError) {
        const Center(
          child: Text(
              'Something get wrong') ,
        );
      }
      final residences = snapshot.data! ;
      print(residences) //<---------- output:[];
      return TabBarView(children: [
        Body(
          residencesList: residences,
          isMain: true,
        ),

排查方向

1. 检查Firestore安全规则

确认Firestore规则是否允许读取residences集合。默认规则仅允许认证用户访问,若当前未登录,会静默返回空数据。可临时设置测试规则验证:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true; // 仅测试用,上线需恢复安全规则
    }
  }
}

2. 验证orderBy字段的存在性

代码中使用orderBy(ResidencesField.updatedAt)排序,若集合中文档缺失updatedAt字段,Firestore会自动过滤该文档,导致返回空列表。可临时移除orderBy条件测试是否能获取数据。

3. 检查ResidenceModel.fromJson解析逻辑

若fromJson方法存在字段不匹配、类型转换错误,会导致模型实例创建失败,最终列表为空。可在transformer中添加日志排查:

handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
  print('文档总数:${data.docs.length}');
  final snaps = data.docs.map((doc) => doc.data() as Map<String, dynamic>).toList();
  print('原始文档数据:$snaps');
  final residences = snaps.map((json) => fromJson(json)).toList();
  print('解析后模型数量:${residences.length}');
  sink.add(residences);
},

如果data.docs.length为1但residences.length为0,说明fromJson方法存在问题,需检查字段映射是否正确。

4. 修复StreamBuilder的错误处理逻辑

当前代码中错误分支没有return语句,会导致错误场景下仍执行后续代码,掩盖问题。修改为:

if (snapshot.hasError) {
  return const Center(child: Text('获取数据出错'));
}
if (snapshot.data == null || snapshot.data!.isEmpty) {
  return const Center(child: Text('暂无数据'));
}

5. 确认集合名称大小写一致

Firestore集合名称区分大小写,确保代码中collection('residences')的名称与控制台中的集合名称完全一致。

内容的提问来源于stack exchange,提问作者Alioune Sakho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:33:33