Flutter使用GetX+Firestore时报错Object?无法赋值给Map<dynamic, dynamic>如何解决
问题原因
新版cloud_firestore SDK的DocumentSnapshot.data()方法默认返回Object?类型,不会自动推断为Map类型,因此无法直接传入要求Map<dynamic, dynamic>参数的CategoryModel.fromJson方法,完全不需要修改核心库代码,只需调整业务层代码即可解决。
具体修改方案
1. 优化CategoryModel定义(适配空安全+规范类型)
class CategoryModel { late String name, image; CategoryModel({required this.name, required this.image}); // 将参数类型修改为更规范的Map<String, dynamic>,空安全下无需判空 CategoryModel.fromJson(Map<String, dynamic> map) : name = map['name'] as String, image = map['image'] as String; // 明确toJson返回类型 Map<String, dynamic> toJson() { return { 'name': name, 'image': image, }; } }
2. 调整HomeViewModel中的数据读取逻辑
方案A:直接强转类型(快速适配)
修改getCategory方法中的取值逻辑,对data()返回值做类型转换:
getCategory()async{ _categoryCollectionRef.get().then((value) { for(int i = 0; i<value.docs.length;i++){ // 增加类型转换 final data = value.docs[i].data() as Map<String, dynamic>; _categorymodel.add(CategoryModel.fromJson(data)); } // 若使用GetBuilder绑定UI,需调用update触发刷新 update(); }); }
方案B:使用withConverter指定集合类型(更规范,推荐)
直接在定义集合引用时绑定序列化/反序列化逻辑,后续无需重复强转:
class HomeViewModel extends GetxController{ List<CategoryModel> get categorymodel => _categorymodel; late DocumentSnapshot doc; List<CategoryModel> _categorymodel = []; // 集合引用直接绑定CategoryModel类型转换逻辑 final CollectionReference<CategoryModel> _categoryCollectionRef = FirebaseFirestore.instance.collection('categories').withConverter<CategoryModel>( fromFirestore: (snap, _) => CategoryModel.fromJson(snap.data()!), toFirestore: (model, _) => model.toJson(), ); HomeViewModel(){ getCategory(); } getCategory()async{ _categoryCollectionRef.get().then((value) { // 直接取data()即为CategoryModel类型,无需手动解析 _categorymodel = value.docs.map((doc) => doc.data()).toList(); update(); }); } }
内容的提问来源于stack exchange,提问作者Mhdi Blhoms
相关产品推荐
相关产品推荐

