繁体   English   中英

在 Firebase 模拟器中一次更新后多次读取 Firestore 文档

[英]Firestore document is read multiple times after a single update in Firebase emulator

我正在使用 Firestore 来保存用户数据。 我的应用程序中的每个用户都有一个 stream 来收听用户的文档。 我正在运行 Firestore 模拟器并注意到有时在更新用户文档后,文档被读取两次或更多次。 我附上了一张来自 Firestore 模拟器的图片来显示这一点。 为什么我在一次更新后获得多次读取是有原因的。 我没有对 stream 之外的用户文档进行任何读取。

在此处输入图像描述

我正在使用 Flutter 移动应用程序观看用户文档“.snapshots()”。 此代码中的 print 语句仅打印一次读取。 但是,如果我只读取 stream 中的用户文档,那么我如何在模拟器中以 2 次读取结束?

  Stream<MyProfile?> watchMyProfile() {
    return _firestore
        .doc(PathService.user(uid))
        .withConverter<MyProfile>(
          fromFirestore: (snapshot, _) {
            return MyProfile.fromJson(snapshot.data()!);
          },
          toFirestore: (myProfile, _) => myProfile.toJson(),
        )
        .snapshots()
        .map((doc) => doc.data())
        .map(
      (myProfile) {
        // THIS ONLY PRINTS ONCE.
        debugPrint('watchMyProfile - read my profile');
        return myProfile;
      },
    );
  }

更新 1:为了确保在更新 firestore.rules 文件后我没有阅读任何用户文档,我使用了如下内容:

allow update: if true;
allow get: if true;
allow list: if true;

不幸的是,在更新用户文档后,我仍然看到很多阅读。

在此处输入图像描述

我在最后重现了这个问题并发现了相同的行为。 正如您在提供的图像中看到的那样,读取量显着增加。

在此处输入图像描述

这是由于在 stream 中构建了 stream。如果页面上有 animation,它将在每次调用 build() 时重新创建,每秒最多 60 次。

我建议您在私有变量中构造 stream,然后在 stream 中使用它,这样它就不会在每个构建方法上重新创建,并且只会被调用一次。

像这样的东西

class SomeClass extends State<Some_State>{
    final Stream<MyProfile> _usersStream =             
    FirebaseFirestore.instance.collection('users').doc('ABC123').snapshots();
    
@override
  Widget build(BuildContext context) {
    return StreamBuilder<MyProfile>(
      stream: _usersStream,
        builder: (context, snapshot) {
        //…
  }
}

作为参考,文档的实时更新由 StreamBuilder 完成,如此处所示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM