Flutter StreamBuilder读取Firestore数据异常:document.length显示为0但数据库有数据
Flutter Firestore StreamBuilder 读取数据为空问题
问题描述
尝试通过StreamBuilder展示Firestore中Goals集合的数据,但读取失败。调试发现documents.length输出为0,尽管Firestore控制台中确实存在对应数据。已尝试官方文档及视频教程中的方法,均未解决问题。
代码片段
@override Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (BuildContext context) => const PostScreen(), ), ); }, // onPressed: createNewObject, child: const Icon(Icons.add), ), body: StreamBuilder( stream: _firestore .collection('Goals') .orderBy('timestamp') .snapshots(includeMetadataChanges: true), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasError) return Text('ERROR: ${snapshot.error}'); if (snapshot.connectionState == ConnectionState.waiting) { print('Waiting...'); return const Center( child: CircularProgressIndicator( backgroundColor: lightHoney, ), ); } print('Connected!'); List<DocumentSnapshot> documents = snapshot.data!.docs; print(documents.length); return ListView( children: documents.map((DocumentSnapshot document) { print(document['writer']); return ListTile( title: Text(document['goalTitle']), ); }).toList(), ); }, ), ); }
相关截图


排查与解决方法
- 检查Firestore安全规则:默认规则禁止未授权访问,测试阶段可临时设置允许所有读写(上线前务必修改为严格权限规则):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } - 确认集合名称大小写:Firestore集合名称区分大小写,检查代码中的
'Goals'与控制台中的集合名是否完全一致。 - 检查索引配置:使用
orderBy('timestamp')可能需要创建对应索引。若Firebase控制台有索引缺失提示,按照提示生成索引即可。 - 验证数据结构:确保
Goals集合下的文档直接存在(非子集合),且每个文档包含timestamp字段(orderBy依赖该字段排序,缺失字段的文档仍会被返回,但需确认规则未过滤)。 - 确认Firebase初始化:确保在应用启动时已调用
Firebase.initializeApp(),否则_firestore实例无法正常工作。
内容的提问来源于stack exchange,提问作者ボロボロ
相关产品推荐
相关产品推荐

