文档快照监听器

时间:2021-07-29 08:35:20

标签: flutter google-cloud-firestore

我有一个问题,我如何根据 currentUserinitState 的电子邮件听取对文档快照的实时更改。我知道 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 的新手。提前致谢。

2 个答案:

答案 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)
相关问题