gpt4 book ai didi

firebase - 我的带有 Firestore 的 Flutter 应用在​​从 Android 后台恢复时遇到非常慢的查询

转载 作者:行者123 更新时间:2023-12-03 13:30:19 26 4
gpt4 key购买 nike

使用 flutter 1.20.2。
我的 Flutter 应用程序使用 Firestore 作为后端数据库。对于我正在使用的当前版本以及在此移动应用程序的整个开发过程中,我注意到如果我的应用程序在后台运行一段时间(可能是几分钟),那么当我将应用程序带回前台时,查询返回数据非常慢。这不会发生在 iOS 上。它只发生在 Android 上。
当我的应用忙于从 Firestore 检索数据时,我使用 CircularProgressIndicators。我正在使用固态管理设置,其中我的每个 View 都有一个扩展 BaseModel 的模型:

class BaseModel extends ChangeNotifier {
ViewState _state = ViewState.Idle;
ViewState get state => _state;
bool isDisposed = false;

void setState(ViewState viewState) {
_state = viewState;
if (!isDisposed) {
notifyListeners();
}
}

@override
void dispose() {
isDisposed = true;
super.dispose();
}
}
我的 View 然后以以下方式使用我的 View 特定模型:
  @override
Widget build(BuildContext context) {
return BaseView<MyProfileModel>(
//onModelReady: (model) => model.initialise(Provider.of<User>(context, listen: false)),
onModelReady: (model) => model.initialise(),
builder: (context, model, child) => Scaffold(
resizeToAvoidBottomInset: false,
...
当应用程序在后台或从后台恢复时,我还没有使用 AppLifecycleState 类来做任何特殊的事情。
当我的模型忙于检索数据时,我会显示忙碌的循环进度指示器。
问题是,当我从后台恢复我的应用程序到前台时,有时应用程序可能会在检索数据之前忙碌长达 1 分钟 - 但只有在第一次回到前台之后。之后的所有调用都是正常的。有时,它甚至会在返回前台后第一次尝试获取数据时挂起。
我觉得我没有实现与将应用程序恢复到使用 Firestore 数据库的前台相关的最佳实践。我怀疑它与重新建立 Firestore 连接和/或本地缓存有关。我的应用程序使用这些的默认设置。
我所有的 Firestore API 调用都包含在它自己的类中,我每次都以相同的方式调用它:
    await Firestore.instance
.collection(DBStrings.COLLECTION_AD_MESSAGES)
.document(ad.adId)
.collection(DBStrings.COLLECTION_CHILD_AD_MESSAGES)
.document()
.setData({
// Set fields...
}).catchError((e) {
res = false;
});
有人可以让我深入了解这个问题以及可能导致它的原因吗?

最佳答案

在我看来,您的应用程序正在断开连接,并且检索到的数据来自缓存。我的建议是,当您的应用程序在后台时,您可以尝试从 Firebase 控制台更改后端数据,然后测试检索到的数据是更新的数据还是旧的数据。
如果数据是旧的,则意味着您的应用无法恢复连接。要解决此问题,您需要检查身份验证状态(如果使用)并检查连接状态。识别连接状态并且不允许应用程序在缓存之前花费很长时间的一种简单方法是强制应用程序从远程请求数据并提供超时,如下所示:

QuerySnapshot snapshot = await query.getDocuments(source: Source.server).timeout(
_timeoutDuration,
// this or any other callback to handle timeout
onTimeout: () => query.getDocuments(source: Source.cache));
如果您使用的是 auth,您可以通过调用来检查 auth 状态:
FirebaseUser currentUser = await _auth.currentUser();
if (currentUser != null) {
// Handle your auth problem here
}
如果您没有使用身份验证并且应用程序在这么长时间后从服务器检索数据,请检查应用程序是否会在没有 firebase 查询的情况下更快地恢复。

关于firebase - 我的带有 Firestore 的 Flutter 应用在​​从 Android 后台恢复时遇到非常慢的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63434654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com