Flutter Firebase报错:参数类型'Object?'无法赋值给'Map<String, dynamic>'参数
报错根因
该报错出现在cloud_firestore 2.0.0及以上版本,框架引入空安全规则后,DocumentSnapshot.data() 方法默认返回Object?类型,不会自动识别为文档对应的Map<String, dynamic>结构,直接传入要求Map<String, dynamic>类型参数的fromMap方法就会触发类型不匹配。
修复方案
- 方案1:对返回结果做显式类型转换
直接修改fromSnapshot构造方法,对data()的返回值做强制类型转换即可:
Record.fromSnapshot(DocumentSnapshot snapshot) : this.fromMap(snapshot.data() as Map<String, dynamic>, reference: snapshot.reference);
如果需要兼容空数据场景,可以增加空值 fallback 逻辑:
Record.fromSnapshot(DocumentSnapshot snapshot) : this.fromMap( snapshot.data() as Map<String, dynamic>? ?? {}, reference: snapshot.reference, );
- 方案2:给
DocumentSnapshot增加泛型约束
你可以直接在构造方法的参数声明时指定快照的泛型类型,这样data()方法会直接返回Map<String, dynamic>类型的结果:
Record.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snapshot) : this.fromMap(snapshot.data()!, reference: snapshot.reference);
注意:上述代码中的!为空断言符,确认当前快照数据一定非空,若业务场景存在文档不存在的可能,需要提前做空判断,避免空异常
额外注意
你之前尝试给map添加()调用符的操作是错误的,map是普通字典对象不是可调用函数,需要删除所有map()相关的写法,恢复为map['字段名']的标准取值方式。
内容的提问来源于stack exchange,提问作者winfred adrah
相关产品推荐
相关产品推荐

