首页 > 解决方案 > 如何在 Flutter 中实时监听 Firebase 更新

问题描述

我有一个从 firebase 读取用户数据的流。我在登录后触发它,它工作得很好。我在我的应用栏中显示数据。当我手动更新 firebase 时,我想立即在我的应用栏上看到新日期。首先,我猜我的 appbar 有问题,但后来我注意到更新 firebase 数据时我的流没有触发。这是我的流代码片段。我错过了什么?

static Future<User> userDataStream(userID) async {
    print("userDataStream");

    final databaseReference = Firestore.instance;
    User currentUser = User();

    await for (var snapshot in databaseReference
        .collection('users')
        .where('userID', isEqualTo: userID)
        .snapshots()) {
      currentUser.userName = snapshot.documents.first.data['userName'];
      currentUser.email = snapshot.documents.first.data['email'];
      currentUser.userID = snapshot.documents.first.data['userID'];
      currentUser.level = snapshot.documents.first.data['level'];
      currentUser.balance = snapshot.documents.first.data['balance'];

      print(currentUser.balance);

      return currentUser;
    }

    return currentUser;
  }

标签: firebasefluttergoogle-cloud-firestorestream

解决方案


你如何使用这个流很重要。await for开始倾听用户的声音,然后你return currentUser;在其中做并打破await for. 因此,它以后不能继续收听流。

而不是return currentUser;inside await for,您可以执行类似setState((){this.renderedUser = currentUser;})的操作,以便来自服务器的用户成为呈现的用户。如果你这样做,还要在if (!mounted) return;里面添加,await for这样当你意识到你在不同的屏幕上时你就停止收听它。

更好的选择可能是使用StreamBuilder小部件。


推荐阅读