Flutter新版Firebase通过snapshot取数据报[]运算符未定义错误
问题原因
cloud_firestore 2.0及以上的空安全版本调整了类型校验规则,DocumentSnapshot的data()方法返回值默认类型为Object?,不再是旧版本默认的Map<String, dynamic>,直接对返回值调用[]操作符读取字段,就会抛出The operator '[]' isn't defined for the type 'Object'错误,和字段名写法、是否给data加括号无关,本质是缺少显式类型转换。
修复方法
无需降级依赖,显式将snapshot.data()的返回值转换为Map<String, dynamic>类型后再读取字段即可正常运行,修正后的完整代码如下:
import 'package:cloud_firestore/cloud_firestore.dart'; class UserModel { final String UID = "uid"; final String USERNAME = "username"; final String EMAIL = "email"; final String FIRSTNAME = "first name"; final String LASTNAME = "last name"; final String BIRTHDAY = "birthday"; final String GENDER = "gender"; String _uid; String _username; String _email; String _firstName; String _lastName; String _birthday; String _gender; // getters String get uid => _uid; String get username => _username; String get email => _email; String get firstName => _firstName; String get lastName => _lastName; String get birthday => _birthday; String get gender => _gender; UserModel.fromSnapshot(DocumentSnapshot snapshot) { // 显式转换data()返回值为Map类型 final data = snapshot.data() as Map<String, dynamic>; _uid = data[UID]; _username = data[USERNAME]; _email = data[EMAIL]; _firstName = data[FIRSTNAME]; _lastName = data[LASTNAME]; _birthday = data[BIRTHDAY]; _gender = data[GENDER]; } }
注意事项
- 不要使用
snapshot.data['uid']写法,data()是DocumentSnapshot的实例方法而非属性,必须带括号调用,旧版本可运行是因为当时做了隐式getter兼容,新版已移除该兼容逻辑。 - 若读取的文档可能不存在,建议在转换前先判断
snapshot.exists属性,避免空指针异常。
内容的提问来源于stack exchange,提问作者albaum
相关产品推荐
相关产品推荐

