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

Я работаю над проектом 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 Ответ

0 голосов
/ 08 января 2019

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

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

...