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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:57:36