Flutter访问[image][name]时提示类型'Object'未定义运算符'[]'报错
问题原因
新版cloud_firestore插件做了空安全和类型校验升级,QueryDocumentSnapshot的data()方法返回值从原来的Map<String, dynamic>调整为Object?类型,Dart语法不允许直接对Object类型使用[]运算符取值,因此抛出该错误。
解决方案
方法1:显式类型转换(快速修复)
将element.data()的返回值强制转换为Map<String, dynamic>类型即可,修改遍历部分代码:
querySnapshot.docs.forEach((element) { // 新增类型转换逻辑 Map<String, dynamic> data = element.data() as Map<String, dynamic>; categoriesModle = CategoriesModle( image: data['image'], name: data['name'] ); // 补充:你的原代码漏了将实例存入列表、更新状态的逻辑,加上才能拿到最终数据 newCategoriesList.add(categoriesModle); }); categoriesList = newCategoriesList; notifyListeners();
方法2:查询时指定序列化类型(更推荐,类型安全)
在发起查询阶段就声明返回数据的类型,后续所有操作都不需要手动转类型:
// 查询时通过withConverter指定返回数据格式 QuerySnapshot<Map<String, dynamic>> querySnapshot= await FirebaseFirestore.instance .collection('categories') .doc('MGBnYPFAzw4hln0qwckh') .collection('burger') .withConverter<Map<String, dynamic>>( fromFirestore: (snap, _) => snap.data()!, toFirestore: (map, _) => map, ) .get(); // 后续可直接用[]取值,无需额外转换 querySnapshot.docs.forEach((element) { categoriesModle = CategoriesModle( image: element.data()['image'], name: element.data()['name'] ); newCategoriesList.add(categoriesModle); });
内容的提问来源于stack exchange,提问作者Ayorinde Michael
相关产品推荐
相关产品推荐

