我在Flutter应用程序中使用Firestore。每次用户启动应用程序时,它都会从云中检索一些数据。
QuerySnapshot dataSnapshot = await Firestore.instance
.collection('/data')
.getDocuments();
用户首次打开应用程序时,要求他在线连接,获取数据并按照Firebase文档所述
对于Android和iOS,默认情况下启用离线持久性。要禁用持久性,请将PersistenceEnabled选项设置为false。
因此,当设备离线时,它应该保存在读取应用程序之前已被读取的数据;因此,用户可以随时使用已读取的相同数据访问应用程序。
问题是:设备离线时,使用相同的代码并且没有任何更改,需要很长时间才能检索数据!
我尝试配置需要多少时间?在离线状态下,大约需要8分40秒。但是,在线时只需10秒,甚至可能更少。
那我该如何解决这个问题?
非常感谢。
答案 0 :(得分:0)
最后,在diegoveloper中的GitHub issue评论的帮助下,我找到了解决方案。
如果我决定每次检查源代码然后再使用它,或者可以在开始新的Flutter项目时使用它,
await Firestore.instance .collection("Collection") .getDocuments(source: source)
是一个很好的解决方案,但是现在我已经有很多代码需要更好的解决方案。因此,我决定分叉cloud_firestore软件包并对其进行编辑。
您可以在这里找到它:https://github.com/ShadyBoshra2012/flutterfire/tree/master/packages/cloud_firestore
// 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;
}
query.dart
source = Firestore.source;
第92行
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编写出越来越好的解决方案。谢谢大家的参与。