Firestore数据读取报错:_Map<String,dynamic>无法转为User类型
问题描述
尝试使用自定义User数据模型从Firestore读取数据:直接将快照映射为Map<String, dynamic>时能正常工作,但转为User类型时出现错误:type '_Map<String, dynamic>' is not a subtype of type 'User' in type cast。修改User模型中的Map定义后仍无效,求排查问题。
错误原因
Firestore返回的文档数据是原生的_Map<String, dynamic>结构,无法直接通过as User强制类型转换为自定义类实例——Dart不支持这种跨类型的直接转换,必须通过模型类提供的fromJson构造函数,手动将Map数据解析为User对象。
解决方案
修改ReadData组件中的FutureBuilder逻辑,先将快照数据转为Map,再通过User.fromJson()构造函数生成User实例,同时处理数据为空的边界情况:
修改后的ReadData代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_project_1/user_model/user_model.dart'; import 'package:flutter/material.dart'; class ReadData extends StatelessWidget { const ReadData({required this.docIDs, super.key}); final String docIDs; @override Widget build(BuildContext context) { CollectionReference users = FirebaseFirestore.instance.collection('Users'); return FutureBuilder<DocumentSnapshot>( future: users.doc(docIDs).get(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { // 先判断快照是否有数据,且数据不为null if (snapshot.hasData && snapshot.data!.data() != null) { // 1. 将快照数据转为Map类型 Map<String, dynamic> jsonData = snapshot.data!.data() as Map<String, dynamic>; // 2. 通过fromJson构造函数生成User实例 User userData = User.fromJson(jsonData); return Text( '${userData.rationType}, Rank: ${userData.rank}' ); } else { // 处理文档不存在或数据为空的情况 return const Text('无用户数据'); } } return const Text('Loading......'); }, ); } }
额外注意事项
- 你的
User模型类中的fromJson构造函数已正确映射所有字段,无需修改 - 建议在Firestore文档中补充字段校验,避免因字段缺失导致
fromJson构造时出现类型错误
内容的提问来源于stack exchange,提问作者Sivagnanam Maheshwaran
相关产品推荐
相关产品推荐

