使用 Flutter Riverpod 的 StreamProvider 从 Firestore 获取特定文档



我使用Riverpod的StreamProvider从Firestore中获取一个包含数组的字段,然后将其映射到一个类,如下所示。

final firebaseFollowingProvider = StreamProvider<List<Following>>((ref) {
final stream = FirebaseFirestore.instance.collection('following').doc('d48391af-380d-4377-a3f9-d38cf5af7923').snapshots();
return stream.map((snapshot) => snapshot.data()!.map((doc) => Following.fromDocument(doc)).toList());
});

My Model look like this

class Following {
dynamic following;
Following({this.following});
Following.fromJson(Map<String, dynamic> json)
: following = json['isFollowing'];
Map<String, dynamic> toJson() => {
'isFollowing': following,
};
factory Following.fromDocument(DocumentSnapshot doc) {
return Following(following: doc['isFollowing']);
}
}
我得到的错误是

参数类型'MapEntry<_,>Function(String)'不能被赋值到参数类型"MapEntry<dynamic,>"函数(字符串,动态的)"。(文档)返回类型'Following'不是'MapEntry<</em>, _>',根据闭包上下文的要求。(文档)

既然snapshot.data()已经返回了一个Map,我怎么能映射从StreamProvider返回的数据到一个类?

我使用cloud_firestore: ^2.3.0

非常感谢。

数据库结构

问题是我正在返回类型如下的列表,即<List<Following>>而不是返回Following

final firebaseFollowingProvider = StreamProvider.autoDispose<Following>((ref) {
final stream = followingRef.doc('d48391af-380d-4377-a3f9-d38cf5af7923').snapshots();
return stream.map((snapshot) => Following.fromDocument(snapshot));
});

不要将变量定义为模型类中的dynamic。模型类旨在为您提供类型安全,而dynamic变量逃避类型系统。

这样会更好(还没有测试过):

class Following {
final String following;
Following({required this.following});
Following.fromJson(Map<String, dynamic> json)
: following = json['isFollowing'] as String;
Map<String, dynamic> toJson() => {
'isFollowing': following,
};
factory Following.fromDocument(DocumentSnapshot doc) {
return Following(following: doc['isFollowing'] as String);
}
}

最新更新