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&lt;String, dynamic&gt; 尽管如此,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&lt;String, dynamic&gt; 吗? 我查看了DocumentSnapshot.data() 的定义,发现它使用了一个模板T? data(),而类本身是abstract class DocumentSnapshot&lt;T extends Object?&gt;。现在我明白了Object? 的来源。

如何确保我从DocumentSnapshot.data() 获得Map&lt;String, dynamic&gt; 而不是Object?

如果我将NoteDto.fromFirestore 更改为

factory NoteDto.fromFirestore(DocumentSnapshot<Map<String, dynamic>> doc) 

我仍然需要在某个时候将 Object? 转换为 Map,但这次在以下调用中是 QueryDocumentSnapshot&lt;Object?&gt; doc

...
.map((doc) => NoteDto.fromFirestore(doc).toDomain())
...

【问题讨论】:

你能解决这个问题吗?我在 DataSnapshot 事件中遇到了类似的问题 【参考方案1】:

在其他地方,我有返回 Future&lt;DocumentReference&gt;CollectionReference 的函数。我不得不像这样向它们添加类型:

Future<DocumentReference<Map<String, dynamic>>>
...
CollectionReference<Map<String, dynamic>>

现在,当我收到QueryDocumentSnapshot doc 时:

.map((doc) => NoteDto.fromFirestore(doc).toDomain())

它的类型是 QueryDocumentSnapshot&lt;Map&lt;String, dynamic&gt;&gt; 而不是 QueryDocumentSnapshot&lt;Object?&gt; 解决了我的问题。

【讨论】:

这是否适用于 Datasnapshot 事件?我遇到了与上述类似的情况。请问我可以用你的解决方法获得更深入的例子吗?

以上是关于Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Firebase DocumentSnapshot.data() 返回对象?而不是 Map<String, dynamic> [重复]

在 Flutter 中从 Firebase 读取数组 [重复]

Flutter Firebase 在 null 上调用了方法“数据”

Firebase 因无效安全(DART/FLUTTER)而无法工作

firestore onSnapshot 执行两次

Firestore 获取 DocumentSnapshot 的字段值