Flutter Firebase无法将Cloud Firestore数据存入列表求助
解决Cloud Firestore数据解析的_CastError问题
你遇到的_CastError (type '_Map<String, dynamic>' is not a subtype of type 'String' in type cast),核心原因是**doc.data()返回的是Map<String, dynamic>类型**,但你错误地将其当作String传入jsonDecode——Firestore文档数据本身就是Map结构,完全不需要JSON解析。
以下是几种针对性的解决方案:
直接提取type字段到列表
修改StreamBuilder代码,直接将文档数据转为Map并提取type字段:
StreamBuilder( stream: FirebaseFirestore.instance .collection('type') //.where('userId', isEqualTo: user!.uid) .snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasData) { // 遍历文档,提取每个文档的type字段存入列表 List<String> typeList = snapshot.data!.docs.map((doc) { Map<String, dynamic> docData = doc.data() as Map<String, dynamic>; return docData['type'] as String; }).toList(); // 验证输出 print(typeList); // 示例:用ListView渲染列表 return ListView.builder( itemCount: typeList.length, itemBuilder: (ctx, idx) => ListTile(title: Text(typeList[idx])), ); } else if (snapshot.hasError) { return Text('加载失败:${snapshot.error}'); } // 加载中状态 return const CircularProgressIndicator(); }, )
保留完整文档数据再提取type
如果需要保留每个文档的完整数据,之后再提取type:
StreamBuilder( stream: FirebaseFirestore.instance .collection('type') //.where('userId', isEqualTo: user!.uid) .snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasData) { // 获取所有文档的完整Map数据列表 List<Map<String, dynamic>> allDocs = snapshot.data!.docs.map((doc) { return doc.data() as Map<String, dynamic>; }).toList(); // 遍历提取type字段 List<String> typeList = []; for (var doc in allDocs) { print(doc); // 打印完整文档数据 typeList.add(doc['type'] as String); } print(typeList); // 打印提取后的type列表 return ListView.builder( itemCount: typeList.length, itemBuilder: (ctx, idx) => ListTile(title: Text(typeList[idx])), ); } else if (snapshot.hasError) { return Text('加载失败:${snapshot.error}'); } return const CircularProgressIndicator(); }, )
推荐:用模型类规范数据
对于复杂数据,建议定义模型类来封装,避免类型转换错误:
// 定义Type模型类 class TypeItem { final String id; final String type; TypeItem({required this.id, required this.type}); // 从Firestore的Map数据转成模型 factory TypeItem.fromFirestore(Map<String, dynamic> data) { return TypeItem( id: data['id'] as String, type: data['type'] as String, ); } } // 在StreamBuilder中使用模型类 StreamBuilder( stream: FirebaseFirestore.instance .collection('type') //.where('userId', isEqualTo: user!.uid) .snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasData) { List<TypeItem> typeItems = snapshot.data!.docs.map((doc) { Map<String, dynamic> data = doc.data() as Map<String, dynamic>; return TypeItem.fromFirestore(data); }).toList(); // 提取type列表 List<String> typeList = typeItems.map((item) => item.type).toList(); print(typeList); // 渲染完整的模型数据 return ListView.builder( itemCount: typeItems.length, itemBuilder: (ctx, idx) { final item = typeItems[idx]; return ListTile( title: Text(item.type), subtitle: Text(item.id), ); }, ); } else if (snapshot.hasError) { return Text('加载失败:${snapshot.error}'); } return const CircularProgressIndicator(); }, )
内容的提问来源于stack exchange,提问作者Fedy Belaid
相关产品推荐
相关产品推荐

