我有一个问题,我如何根据 currentUser
中 initState
的电子邮件听取对文档快照的实时更改。我知道 QuerySnapshot
需要使用 documents.forEach
才能检索,但是 DocumentSnapshot
怎么样。这是我的代码:
@override
void initState() async{
FirebaseUser user = await FirebaseAuth.instance.currentUser();
Firestore.instance.collection('user').document(user.email).snapshots()
.listen((userinfo){
userinfo((userI){
_fname = userI.data['FullName'];
_SSID = userI.data['SSID'];
_email = userI.data['email'];
_image = userI.data['image'];
});
});
super.initState();
}
我能够获得 user.email
,但无法收听 Firestore。我真的找不到与此类似的任何内容,这可能是一个相对容易解决的问题,因为我仍然是 Flutter 和 Firebase 的新手。提前致谢。
答案 0 :(得分:1)
它应该是 userI.data()['some_key']
而不是 userI.data['some_key']
。
https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/DocumentSnapshot/data.html
也重新userInfo
,应该是这样的:
Firestore.instance.collection('user').document(user.email).snapshots().listen((userI) {
_fname = userI.data()['FullName'];
_SSID = userI.data()['SSID'];
_email = userI.data()['email'];
_image = userI.data()['image'];
});
答案 1 :(得分:1)
您可以将异步逻辑移动到不同的函数中,并在您的 initState
中调用它,如下所示:
@override
void initState() {
super.initState();
_getUserData();
}
Future<void> _getUserData() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
Firestore.instance.collection('user').document(user.email).snapshots()
.listen((userinfo) {
setState((){
_fname = userinfo.data['FullName'];
_SSID = userinfo.data['SSID'];
_email = userinfo.data['email'];
_image = userinfo.data['image'];
});
});
}
在使用变量的小部件中,您可以轻松添加空检查并显示空值或加载指示器。
Text(_fname??'')
或
_fname == null ? Center(child: CircularProgressIndicator()) : Text(_fname)