如何解决用户数据的 Firestore 文档流
我正在尝试根据用户在注册时提供的 Firestore 中存储的数据创建用户数据流。对于此过程,我使用 rxdart 和提供程序进行流,如下所示:
class Document<T> {
final FirebaseFirestore _db = FirebaseFirestore.instance;
final String path;
DocumentReference ref;
Document({@required this.path}) {
ref = _db.doc(path);
}
Stream<T> streamData() {
return ref.snapshots().map((v) => Global.models[T](v.data) as T);
}
}
class UserData<T> {
final FirebaseAuth _auth = FirebaseAuth.instance;
final String collection;
UserData({this.collection});
Stream<T> get documentStream {
return _auth.authStateChanges().switchMap((user) {
if (user != null) {
Document<T> doc = Document<T>(path: '$collection)/${user.uid}');
return doc.streamData();
} else {
return Stream<T>.value(null);
}
});
}
}
数据模型:
class StoredUserData {
final String name;
final String company;
final bool isAdmin;
final List devicesAllowed;
final List devicesOwned;
final List plans;
StoredUserData(
{@required this.name,@required this.company,@required this.isAdmin,@required this.devicesAllowed,@required this.devicesOwned,@required this.plans});
factory StoredUserData.fromMap(Map data) {
return StoredUserData(
name: data['name'] ?? '',company: data['company'] ?? '',isAdmin: data['isAdmin'] ?? false,devicesAllowed: data['devicesAllowed'] as List ?? [],devicesOwned: data['devicesOwned'] as List ?? [],plans: data['plans'] as List ?? [],);
}
}
供应商:
StreamProvider<StoredUserData>.value(
value: UserData<StoredUserData>(collection: 'users').documentStream)
全局变量:
class Global {
static final Map models = {
StoredUserData: (data) => StoredUserData.fromMap(data)
};
}
这样做总是会导致用户数据为空,即使它在数据库上有数据。但是当我使用 StreamBuilder 时,我可以通过等待 AsyncSnapshot 数据来访问该值并获得正确的值。
目标是能够访问一些深度嵌套的小部件中的用户数据,同时能够根据用户数据的布尔值动态更改视图,这就是为什么我需要流而不是未来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。