Flutter Firestore离线时需要长时间检索数据

时间:2019-03-30 21:59:04

标签: dart flutter google-cloud-firestore

我在Flutter应用程序中使用Firestore。每次用户启动应用程序时,它都会从云中检索一些数据。

QuerySnapshot dataSnapshot = await Firestore.instance
        .collection('/data')
        .getDocuments();

用户首次打开应用程序时,要求他在线连接,获取数据并按照Firebase文档所述

  

对于Android和iOS,默认情况下启用离线持久性。要禁用持久性,请将PersistenceEnabled选项设置为false。

因此,当设备离线时,它应该保存在读取应用程序之前已被读取的数据;因此,用户可以随时使用已读取的相同数据访问应用程序。

问题是:设备离线时,使用相同的代码并且没有任何更改,需要很长时间才能检索数据!

  

我尝试配置需要多少时间?在离线状态下,大约需要8分40秒。但是,在线时只需10秒,甚至可能更少。

那我该如何解决这个问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

最后,在diegoveloper中的GitHub issue评论的帮助下,我找到了解决方案。

此评论

  

await Firestore.instance .collection("Collection") .getDocuments(source: source)

如果我决定每次检查源代码然后再使用它,或者可以在开始新的Flutter项目时使用它,

是一个很好的解决方案,但是现在我已经有很多代码需要更好的解决方案。因此,我决定分叉cloud_firestore软件包并对其进行编辑。

您可以在这里找到它:https://github.com/ShadyBoshra2012/flutterfire/tree/master/packages/cloud_firestore

我编辑的内容:

  1. firestore.dart
// The source of which the data will come from.
 static Source _source = Source.serverAndCache;

 static Source get source => _source;

 Future<void> settings(
     {bool persistenceEnabled,
     String host,
     bool sslEnabled,
     bool timestampsInSnapshotsEnabled,
     int cacheSizeBytes,
     Source source}) async {
   await channel.invokeMethod<void>('Firestore#settings', <String, dynamic>{
     'app': app.name,
     'persistenceEnabled': persistenceEnabled,
     'host': host,
     'sslEnabled': sslEnabled,
     'timestampsInSnapshotsEnabled': timestampsInSnapshotsEnabled,
     'cacheSizeBytes': cacheSizeBytes,
   });
   if (source != null) _source = source;
 }
  1. query.dart source = Firestore.source;第92行

  2. document_reference.dart source = Firestore.source;第83行

如何使用它?

因此,通过使用Google的连接软件包:https://pub.dev/packages/connectivity,您可以通过这种方式使用我的分支存储库。

pubspec.yaml文件中添加我的分支存储库

cloud_firestore:
    git:
      url: https://github.com/ShadyBoshra2012/flutterfire.git
      path: packages/cloud_firestore

然后在您的第一个屏幕或主屏幕中

var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.none) {
    await Firestore.instance.settings(source: Source.cache);
} else {
    await Firestore.instance.settings(source: Source.serverAndCache);
}

,如果要在更改连接状态时刷新源:

StreamSubscription subscription;

void initState() {
    super.initState();
    // Check the internet connection after each change
    // of the connection.
    subscription = Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) async {
      // Check the internet connection and then choose the appropriate
      // source for it.
      var connectivityResult = await (Connectivity().checkConnectivity());
      if (connectivityResult == ConnectivityResult.none) {
        await Firestore.instance.settings(source: Source.cache);
      } else {
        await Firestore.instance.settings(source: Source.serverAndCache);
      }
    });
}

@override
  void dispose() {
    super.dispose();
    subscription.cancel();
  }

因此,我希望它能与所有人一起使用,并等待Flutter Team编写出越来越好的解决方案。谢谢大家的参与。