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

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()