如何防止Firestore每次加载应用程序时都加载整个用户数据

时间:2019-04-27 15:23:01

标签: flutter google-cloud-firestore flutter-redux

我正在使用带有redux的flutter进行状态管理。应用加载后,我将从Firestore加载数据以填充我的Redux状态。现在的问题是,每次应用程序初始化时,它都会读取800多个文档。用户数据更改的唯一来源是应用程序本身,并且由于启用了Firestore本地持久性,不应该从本地缓存中加载数据吗?..我缺少什么?

有趣的是,如果我禁用了到设备的Internet连接,加载了应用程序,然后启用了连接,则该应用程序仍然可以正常工作(大概没有从应用程序初始化过程中读取文档,因为它们来自缓存)

基本上,所需的行为是使用本地数据进行初始化,然后仅将用户所做的更新同步到Firebase服务器的应用程序。

class _MyAppState extends State<MyApp> {
    final store = new Store<AppState>(
    appReducer,
    initialState:  new AppState(isLoading: true, logs: []),
    middleware: [thunkMiddleware]);


    initState(){
        super.initState();
        loadData();
      }

   loadData(){
        FirebaseAuth.instance.currentUser().then( (loggedInUser) async {
          if(loggedInUser==null){
            store.dispatch(SetUser(null));
          }
          QuerySnapshot logsQuery = await Firestore.instance.collection("/users/"+loggedInUser.uid+"/logs").getDocuments();
          List<Log> logs = [];
          final logDocs = logsQuery.documents;
          for (DocumentSnapshot logDoc in logDocs) {
            logs.add(Log.fromFireStoreData(logDoc.documentID, logDoc.data));
          }
          store.dispatch(SetUserLogs(logs));
        }
      }
...
    }

1 个答案:

答案 0 :(得分:0)

由于没有足够的信息,我会说问题甚至不是redux或firestore持久性(在没有redux的情况下可以工作吗?如何获取数据?向我们展示一些代码)在帖子中,我将尝试按原样回答,但您应该详细说明。

要特别注意的是,如果您从任何内容中读取800多个字,这是一个大问题,那么任何类型的应用程序中的任何内容都不能远程生成800个读取字。

首先,您必须优化此用户数据查询,并可能优化数据的Firebase结构,为此,我建议您从Firebase YouTube官方频道观看 this video 并阅读> this article 有关定价,并在 this one 中了解最佳做法。从现在开始要非常小心地处理数据,如果仍然不能解决问题,请在线程中进一步解释。