Как ждать метода, который уже выполняется? - PullRequest
1 голос
/ 05 июня 2019

Я разрабатываю приложение 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)null. ").

Это исключение происходит из-за того, что scopedLoadData еще не завершен.Поэтому я ищу способ дождаться выполнения метода, который все еще выполняется.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 июня 2019

Использование должно использовать FutureBuilder на каждой вкладке, чтобы убедиться, что данные загружаются, прежде чем пытаться построить виджет ... больше кода будет полезно

0 голосов
/ 06 июня 2019

Я решил исключение, избавившись от каждого:

setState(() { });

и внедрив ScopedModelDescendant на каждой соответствующей вкладке поверх использования notifyListeners () вконец метода загрузки базы данных.

Это снимает с вкладок ответственность за обновление представлений и передает ее scopedLoadData () .

0 голосов
/ 05 июня 2019

Не уверен, не увидев ваш метод сборки, но я бы начал ваш метод сборки с предложением guard.

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