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

Flutter调用Firestore报错:参数类型Object?无法赋值给Map<dynamic, dynamic>

问题原因

Firebase Firestore 中文档快照的data()方法默认返回Object?类型,未做类型转换时无法直接传入要求Map<dynamic, dynamic>类型参数的CategoryModel.fromJson方法,触发Dart类型校验报错。

解决步骤

1. 适配CategoryModel的fromJson方法空安全逻辑

原方法入参定义为非空Map,和内部的空判断逻辑冲突,且late修饰的属性未赋值会触发运行时异常,修改如下:

class CategoryModel {
  late String name, image;

  CategoryModel({
    required this.name,
    required this.image,
  });

  // 入参改为可空的Map
  CategoryModel.fromJson(Map<dynamic, dynamic>? map) {
    if (map == null) {
      // 空场景下给默认值避免late属性未初始化报错
      name = '';
      image = '';
      return;
    }
    // 新增字段空判断,避免字段不存在时报错
    name = map['name'] ?? '';
    image = map['image'] ?? '';
  }

  toJson() {
    return {
      'name': name,
      'image': image,
    };
  }
}

2. 调用时显式转换data()返回值的类型

在HomeViewModel中调用fromJson时,对data()的返回值做类型转换,同时优化loading状态赋值逻辑:

class HomeViewModel extends GetxController {
  ValueNotifier<bool> get loading => _loading;
  ValueNotifier<bool> _loading = ValueNotifier(false);

  List<CategoryModel> get categoryModel => _categoryModel;
  List<CategoryModel> _categoryModel = [];

  HomeViewModel() {
    getCategory();
  }
  getCategory() async {
    _loading.value = true;
    await HomeService().getCategory().then((value) {
      for (int i = 0; i < value.length; i++) {
        _categoryModel.add(
          CategoryModel.fromJson(
            // 显式转换类型匹配入参要求
            value[i].data() as Map<dynamic, dynamic>?,
          ),
        );
      }
      // loading状态修改移到循环外,避免重复赋值
      _loading.value = false;
      update();
    });
  }
}

内容的提问来源于stack exchange,提问作者sadji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:18:03