我正在开发一个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 ,这样我会收到运行时错误(“未处理的异常:NoSuchMethodError:调用了方法'ancestorWidgetOfExactType'否。” )。
发生此异常是因为 scopedLoadData 尚未完成。因此,我正在寻找一种等待仍在执行的方法的方法。
谢谢!
答案 0 :(得分:0)
不确定没有看到您的构建方法,但我会使用guard子句启动您的构建方法。
if (_oncall == null) return Container(); // or Text("loading") or similar
答案 1 :(得分:0)
在尝试构建窗口小部件之前,应该在每个标签上使用FutureBuilder
来确保已加载数据...更多代码会有所帮助
答案 2 :(得分:0)
我通过摆脱一切来解决了这个异常:
setState(() { });
,并在数据库加载方法结束时使用 notifyListeners()在每个相关选项卡上实现 ScopedModelDescendant 。
这从更新视图的选项卡中提取责任,并将其分配给 scopedLoadData()。