Flutter接入Firestore查询集合数据报QuerySnapshot相关错误如何解决
报错原因
QuerySnapshot类型本身不支持下标访问也没有length属性,你需要先访问它的docs属性,才能拿到包含所有文档的List<QueryDocumentSnapshot>类型列表。- 你后续可能遇到的
Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist报错,是因为没有先调用DocumentSnapshot的data()方法获取文档的键值对数据,就直接访问字段导致的。
修正后完整代码
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_core/firebase_core.dart'; // 类名使用大驼峰符合Dart规范 class TestPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: StreamBuilder( stream: FirebaseFirestore.instance .collection('countries') .snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> querySnapshot) { if (querySnapshot.hasError) return const Text('加载出现错误'); if (querySnapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } // 取docs属性拿到文档列表 final docList = querySnapshot.data!.docs; return ListView.builder( itemBuilder: (context, index) { // 调用data()方法获取文档的Map格式数据 Map<String, dynamic> docData = docList[index].data() as Map<String, dynamic>; return ListTile( // 用??加默认值避免字段缺失导致的崩溃 title: Text(docData['name'] ?? '未知国家'), subtitle: Text(docData['cuisine'] ?? '未知菜系'), ); }, itemCount: docList.length, ); }, ), ); } }
注意事项
- 请确保在项目的入口
main方法中先调用Firebase.initializeApp()完成Firebase初始化,否则会出现运行时错误。 - 如果你的
countries集合下部分文档没有name或cuisine字段,上面代码中的??默认值逻辑可以避免出现Bad state相关报错。 - Dart语法规范要求类名使用大驼峰格式,原代码中的
test类建议调整为符合规范的命名。
内容的提问来源于stack exchange,提问作者name__
相关产品推荐
相关产品推荐

