首页 > 解决方案 > Dart:在 Flutter 应用程序中最小化对 Firebase 的访问

问题描述

我有以下小部件,它根据给定文档 ID 的任务的子集合构建待办事项列表。代码工作正常。

  Widget buildFoodList() {
return SizedBox(
  child: Container(
      padding: const EdgeInsets.all(10.0),
      child: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance.collection('tasks').document(documentID).collection('todo')
            .snapshots(),
        builder: (BuildContext context,
            AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError)
            return new Text('Error: ${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return new Text('Loading...');
            default:
              return new ListView.builder(
                shrinkWrap: true,
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot ds = snapshot.data.documents[index];
                  return new Row(
                    children: <Widget>[
                        Expanded (child:Text(ds['deadline'].toString()) ),
                        Expanded (child:Text(ds['description']) ),
                        Expanded (child:Text("\$"+ds['quantity'].toString()) ),
                    ],
                  );
                },
              );
          }
        },
      )
  ),
);

}

如您所见,我使用的是 StreamBuilder。但是,我知道子集合不会改变。所以问题是使用 StreamBuilder 是否是一种矫枉过正,因为使用流来监听可能会浪费资源和访问 Firebase。更重要的是,使用 Firebase 的成本是按访问量计算的。

总而言之,问题是是否需要使用 StreamBuilder。如果不是,那么可以帮助避免不必要地访问 Firebase 的替代方法是什么。

谢谢。

标签: flutterdartstream-builder

解决方案


StreamBuilder 在您需要在 firebase 集合中获取任何更新、插入或删除的应用程序中是必需的(在这种情况下)。另一种选择是 FutureBuilder ,它获取一次数据,然后您可以包裹在 Swipe 中进行刷新(用户决定何时需要查看新数据)。


推荐阅读