【问题标题】:Flutter Firestore excessive readsFlutter Firestore 过度读取
【发布时间】:2020-12-24 15:03:11
【问题描述】:

我正在创建一个应用程序来为用户显示最新的燃油价格,并且我在我的 Firebase Firestore 数据库上使用快照侦听器,据我了解,只有在我更新数据库...我已将其安装在 1 台设备上,并为该设备获得 33 次读取!

连接到 Firebase 的代码是:

    StreamBuilder<DocumentSnapshot>(
                                    stream: FirebaseFirestore.instance
                                        .collection('global')
                                        .doc('inland')
                                        .snapshots(),
                                    builder: (context, snapshot) {
                                      if (!snapshot.hasData) {
                                        return Text("Loading...",
                                            style: TextStyle(
                                                color: Colors.black,
                                                fontWeight: FontWeight.w700,
                                                fontSize: 34.0));
                                      }
                                      if (snapshot.hasError) {
                                        return Text("Error",
                                            style: TextStyle(
                                                color: Colors.black,
                                                fontWeight: FontWeight.w700,
                                                fontSize: 34.0));
                                      }
                                      if (snapshot.connectionState ==
                                          ConnectionState.waiting) {
                                        return Text("Loading...",
                                            style: TextStyle(
                                                color: Colors.black,
                                                fontWeight: FontWeight.w700,
                                                fontSize: 34.0));
                                      } else {
                                        Map<String, dynamic> document =
                                            snapshot.data.data();
                                        return Text("R " + document['95'],
                                            style: TextStyle(
                                                color: Colors.black,
                                                fontWeight: FontWeight.w700,
                                                fontSize: 34.0));
                                      }

它在一个 AnimatedContainer 中,但据我了解,当它在数据库上没有改变时,应用程序会显示缓存中的价格,所以这应该没什么区别。

我理解错了吗?有没有办法解决这个问题?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    每次颤振调用该小部件的build 方法时,您都会创建流,这可能是很多次。构建方法应该是纯的,没有任何副作用*。换句话说,您不应该在 build 方法中实例化昂贵的对象,例如流。您应该在外部创建对象,并将其传递给小部件。

    要解决这个问题,您可以创建一个有状态的小部件,在 initState 方法中,您应该初始化您的流,然后将其传递给 StreamBuilder。

    class StreamBuilderExample extends StatefulWidget {
      @override
      _StreamBuilderExampleState createState() => _StreamBuilderExampleState();
    }
    
    class _StreamBuilderExampleState extends State<StreamBuilderExample> {
      Stream<DocumentSnapshot> firestoreStream;
      @override
      void initState() {
        firestoreStream = FirebaseFirestore.instance.collection('global').doc('inland').snapshots();
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return StreamBuilder(
          stream: firestoreStream,
          builder: (context, snapshot) {
            // your code goes here
          },
        );
      }
    }
    

    对于您问题的最后一点,如果您告诉 Firestore 这样做或没有互联网连接,Firestore 只会从缓存中读取。每次启动流或获取文档时,Firestore 都会首先到达服务器并再次重新读取文档。虽然当流运行时,Firestore 只会在查询文档发生更改时更新。但如前所述,您会收到很多读取,因为每次构建小部件时都会重新创建您的流(这也可能是由热重载或简单地保存文件引起的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2021-11-08
      • 2021-01-21
      • 2020-04-19
      • 2021-09-30
      • 2020-02-24
      相关资源
      最近更新 更多