如何等待一个已经在执行的方法?
How to wait for a method that is already being executed?
我正在开发一个 Flutter 应用程序,里面有一些选项卡,每个选项卡都依赖于第一个 运行 上加载的数据库。状态存储在 ScopedModel 中。
在每个选项卡上我都有这个代码:
@override
void initState() {
super.initState();
loadData();
}
void loadData() async {
await MyModel.of(context).scopedLoadData();
_onCall = MyModel.of(context).onCall;
setState(() {
});
}
这是对 ScopedModel 很重要的代码片段:
Future<Null> scopedLoadData() async {
if (_isLoading) return;
_isLoading = true;
(...)
_isLoading = false;
}
如果用户在第一个选项卡上等待几秒钟,一切都很好,因为数据库已加载。但是,如果用户在应用程序启动后立即切换选项卡,方法 scopedLoadData 仍在执行,因此我会收到 运行 时间错误("Unhandled Exception: NoSuchMethodError: The method 'ancestorWidgetOfExactType' was called on null.").
发生此异常是因为 scopedLoadData 尚未完成。所以我正在寻找一种方法来等待仍在执行的方法。
谢谢!
在没有看到您的构建方法的情况下不确定,但我会在您的构建方法开始时使用保护子句。
if (_oncall == null) return Container(); // or Text("loading") or similar
use 应该在每个选项卡上使用 FutureBuilder
以确保在尝试构建小部件之前加载数据...更多代码会有所帮助
我通过摆脱每一个解决了异常:
setState(() { });
并在每个相关选项卡上实施 ScopedModelDescendant 在数据库加载方法末尾使用 notifyListeners()。
这从选项卡中提取更新视图的责任,并将其交给 scopedLoadData()。
我正在开发一个 Flutter 应用程序,里面有一些选项卡,每个选项卡都依赖于第一个 运行 上加载的数据库。状态存储在 ScopedModel 中。
在每个选项卡上我都有这个代码:
@override
void initState() {
super.initState();
loadData();
}
void loadData() async {
await MyModel.of(context).scopedLoadData();
_onCall = MyModel.of(context).onCall;
setState(() {
});
}
这是对 ScopedModel 很重要的代码片段:
Future<Null> scopedLoadData() async {
if (_isLoading) return;
_isLoading = true;
(...)
_isLoading = false;
}
如果用户在第一个选项卡上等待几秒钟,一切都很好,因为数据库已加载。但是,如果用户在应用程序启动后立即切换选项卡,方法 scopedLoadData 仍在执行,因此我会收到 运行 时间错误("Unhandled Exception: NoSuchMethodError: The method 'ancestorWidgetOfExactType' was called on null.").
发生此异常是因为 scopedLoadData 尚未完成。所以我正在寻找一种方法来等待仍在执行的方法。
谢谢!
在没有看到您的构建方法的情况下不确定,但我会在您的构建方法开始时使用保护子句。
if (_oncall == null) return Container(); // or Text("loading") or similar
use 应该在每个选项卡上使用 FutureBuilder
以确保在尝试构建小部件之前加载数据...更多代码会有所帮助
我通过摆脱每一个解决了异常:
setState(() { });
并在每个相关选项卡上实施 ScopedModelDescendant 在数据库加载方法末尾使用 notifyListeners()。
这从选项卡中提取更新视图的责任,并将其交给 scopedLoadData()。