инициализировать данные один раз в initState и вызывать setState, когда данные готовы, вызывает исключение - PullRequest
0 голосов
/ 16 октября 2018

Поскольку flutter вызывает метод сборки много раз в разных условиях, чтобы избежать многократного получения данных, я инициализирую данные в initState.

Я хочу перестроить виджет, когда данные будут готовы.

Вот мой код:

class Test extends StatefulWidget {

  @override
  _TestState createState() => new _TestState();

}

class _TestState extends State<Test> {

  Data data;
  bool dataReady = false;

  @override
  void initState() {
    super.initState();

    getData(context).then((Data data) async {
      setState(() {
        dataReady= true;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    if (dataReady) {
      return createMainContent(context);
    } else {
      return new Container();
    }
  }

}

Однако это приводит к следующему исключению: inheritFromWidgetOfExactType (_InheritedProvider) или inheritFromElement () было вызвано до завершения _TestState.initState ().

Могу ли я знать, что я здесь что-то не так делаю?

Когда я добавляю следующую строку к реализации getData (context)

     await Future.delayed(new Duration(milliseconds: 300));

, исключение не происходит.

Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Очевидно, вы не можете получить доступ к getData(context) во время initState (более конкретно: до его завершения).

Причина, по-моему, в том, что getData пытаетсянайдите в дереве предка InheritedWidget, но дерево только что создается (ваш виджет создается во время build родительского виджета).

Очевидное решение - задержать getDataПосмотрим на более поздний момент времени.Есть несколько способов добиться этого:

  • Задержка поиска на фиксированное время.Future.delayed с Duration.zero должно работать нормально.
  • Поиск во время первого build вызова.Вы можете иметь поле isInitialized, установленное на false, а в вас build, что-то вроде:

    if (!isInitialized) {
      isInitialized = true;
      // TODO: do the getData(...) stuff
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...