Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]
Posted
技术标签:
【中文标题】Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]【英文标题】:Firebase DocumentSnapshot.data() returns Object? instead of Map<String, dynamic> [duplicate] 【发布时间】:2021-08-09 04:12:03 【问题描述】:the DocumentSnapshot.data() 的文档说它返回 Map<String, dynamic>
尽管如此,IDE 告诉我错误并声称 data() 返回 Object?
The argument type 'Object?' can't be assigned to the parameter type 'Map<String, dynamic>'.dart(argument_type_not_assignable)
我想要做的是以下
factory NoteDto.fromJson(Map<String, dynamic> json) =>
_$NoteDtoFromJson(json);
factory NoteDto.fromFirestore(DocumentSnapshot doc)
return NoteDto.fromJson(doc.data()).copyWith(id: doc.id);
我应该以某种方式将Object?
转换为Map<String, dynamic>
吗?
我查看了DocumentSnapshot.data()
的定义,发现它使用了一个模板T? data()
,而类本身是abstract class DocumentSnapshot<T extends Object?>
。现在我明白了Object?
的来源。
如何确保我从DocumentSnapshot.data()
获得Map<String, dynamic>
而不是Object?
?
如果我将NoteDto.fromFirestore
更改为
factory NoteDto.fromFirestore(DocumentSnapshot<Map<String, dynamic>> doc)
我仍然需要在某个时候将 Object?
转换为 MapQueryDocumentSnapshot<Object?> doc
:
...
.map((doc) => NoteDto.fromFirestore(doc).toDomain())
...
【问题讨论】:
你能解决这个问题吗?我在 DataSnapshot 事件中遇到了类似的问题 【参考方案1】:在其他地方,我有返回 Future<DocumentReference>
和 CollectionReference
的函数。我不得不像这样向它们添加类型:
Future<DocumentReference<Map<String, dynamic>>>
...
CollectionReference<Map<String, dynamic>>
现在,当我收到QueryDocumentSnapshot doc
时:
.map((doc) => NoteDto.fromFirestore(doc).toDomain())
它的类型是 QueryDocumentSnapshot<Map<String, dynamic>>
而不是 QueryDocumentSnapshot<Object?>
解决了我的问题。
【讨论】:
这是否适用于 Datasnapshot 事件?我遇到了与上述类似的情况。请问我可以用你的解决方法获得更深入的例子吗?以上是关于Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]
在 Flutter 中从 Firebase 读取数组 [重复]
Flutter Firebase 在 null 上调用了方法“数据”