如何等待已经执行的方法?

时间:2019-06-05 19:44:18

标签: flutter dart dart-async

我正在开发一个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 尚未完成。因此,我正在寻找一种等待仍在执行的方法的方法。

谢谢!

3 个答案:

答案 0 :(得分:0)

不确定没有看到您的构建方法,但我会使用guard子句启动您的构建方法。

if (_oncall == null) return Container(); // or Text("loading") or similar

答案 1 :(得分:0)

在尝试构建窗口小部件之前,应该在每个标签上使用FutureBuilder来确保已加载数据...更多代码会有所帮助

答案 2 :(得分:0)

我通过摆脱一切来解决了这个异常:

setState(() { });

,并在数据库加载方法结束时使用 notifyListeners()在每个相关选项卡上实现 ScopedModelDescendant

这从更新视图的选项卡中提取责任,并将其分配给 scopedLoadData()