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
相关产品推荐
相关产品推荐

