Как открыть диалоговое окно флаттера независимо от того, где находится пользователь в приложении

Я работаю над проектом Flutter, где мне нужна возможность показывать пользователю диалог, независимо от того, где он находится в приложении. В настоящее время я выполняю функцию showDialog() в виджете корневого уровня, который запускается main().
Этот виджет реализует WidgetsBindingObserver, так что я могу слушать, когда приложение перемещается из фона на передний план через функцию didChangeAppLifecycleState(). Каждый раз, когда это происходит, я делаю запрос поставщику услуг и в зависимости от результатов мне нужно показать диалоговое окно.
Пользователи будут переходить на какой-то другой маршрут в любое время, когда это произойдет, и именно здесь я, похоже, столкнулся с проблемой. Ниже приведена урезанная функция, которая выполняет вызов API и последующую попытку showDialog(). Но ничего не происходит. Я попытался обернуть его в 2-секундный таймер, думая, что, может быть, проблема в том, что приложение просто возвращается на передний план, но это не имело значения.

void _fetchSuperAwesomeStuff() {
  final apiCaller = new SuperAwesomeStuffAPI();
  apiCaller.fetchSuperAwesomeStuff().then((List<SuperAwesomeStuff> superAwesomeStuffs) {
    if (superAwesomeStuffs != null && superAwesomeStuffs.length > 0) {
      SuperAwesomeStuff superAwesomeStuff = superAwesomeStuffs[0];

      // .... DOING STUFF WITH THIS SUPER AWESOME STUFF .... //

      // NEED TO SHOW A DIALOG.
      showDialog(
        context: context,
        builder: (_) => new AlertDialog(
          title: Text('Test Title'),
          actions: <Widget>[
            new FlatButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: new Text('Close'),
            ),
          ],
        ),
      );
    }
  });
}

Любая помощь с этим будет принята с благодарностью, спасибо!

1 ответ

Вам нужно пройти BuildContext для context переменная, и этот контекст должен быть смонтирован (соответствующий элемент) в дереве, когда вы делаете вызов.

В качестве альтернативы, вы можете отправить сообщение / поток из вашей сверхъестественной логики в любую часть приложения, которая имеет контекст и прослушивает поток. Отсюда вы можете вызвать диалог.

Другие вопросы по тегам