首页 > 解决方案 > 将 StreamBuilder 用于相同的流及其对从 firestore 读取的次数的影响

问题描述

我有以下 getter 函数来从 firestore 获取用户配置文件数据。

  Stream<UserProfile> get userProfile {
    FirebaseAuth _auth = FirebaseAuth.instance;
    try {
      return _auth.currentUser == null
          ? null
          : _firestore
              .collection('users')
              .doc(_auth.currentUser.uid)
              .snapshots()
              .map(
                (DocumentSnapshot documentSnapshot) => UserProfile(
                  uid: documentSnapshot.data()['uid'],
                  email: documentSnapshot.data()['email'],
                ),
              );
    } on Exception catch (e) {
      print(e);
      return null;
    }
  }

据我了解,这个 getter 稍后将与 StreamBuilder 一起使用。调用这个getter会增加我在firebase firestore中的读取次数1,并且读取次数只会在这个特定的用户数据发生变化时增加(更新时)。

但是,如果我在 2 个不同的颤振文件/小部件中调用这个 getter,读取次数会如何变化?由于我在 2 个不同的地方调用它,这是否意味着对于从每个唯一文件进行的每次调用,读取次数都会增加 1?或者,因为我使用相同的吸气剂,即使我在不​​同的地方调用它,它的整体成本是否为 1?

标签: firebasefluttergoogle-cloud-firestore

解决方案


每次调用此代码时:

          _firestore
              .collection('users')
              .doc(_auth.currentUser.uid)
              .snapshots()

这将花费至少 1 次读取,以及每次文档更改时的更多读取。无论代码是否在 getter 函数中,或者您选择以何种方式进行此查询,它的成本都是一样的。

如果您希望所有代码共享一个流,那么您应该只执行一次查询、存储流并独立提供该流。


推荐阅读