Flutter Firestore调用message.data['text']报[]操作符未定义错误
报错原因
这个报错是cloud_firestore 2.0及以上版本的API变更导致的:
- 旧版本中
DocumentSnapshot的文档数据是通过data属性直接获取的,返回值为Map类型 - 新版本中
data调整为需要调用的方法,必须加括号data()才能拿到返回的文档内容,直接写message.data拿到的是方法本身,类型为Object? Function(),自然无法使用[]运算符取字段 - 同时新版本做了类型安全优化,
data()返回值默认是Object?类型,需要显式转换为Map<String, dynamic>才能正常读取内部字段
修复方案
将StreamBuilder中遍历消息、读取字段的代码替换为如下写法即可:
for (var message in messages) { // 调用data()方法获取文档数据,显式转换为字符串键的Map类型 final messageData = message.data() as Map<String, dynamic>; final messageText = messageData['text']; final messageSender = messageData['sender']; final messageWidget = Text('$messageText from $messageSender'); messageWidgets.add(messageWidget); }
核心修改点:
- 所有读取文档数据的位置,把
message.data改为message.data(),保证执行方法拿到实际返回值 - 不要直接把未执行的data方法做类型转换,先拿到方法返回结果再转成
Map<String, dynamic>类型,避免类型不匹配问题
如果后续要做更规范的类型安全写法,可以给Firestore的集合引用配置泛型,不需要每次手动做类型转换,新手阶段先用上面的写法就能解决当前报错,正常运行聊天功能。
内容的提问来源于stack exchange,提问作者Sahil Bhosale
相关产品推荐
相关产品推荐

