Как открыть диалоговое окно флаттера независимо от того, где находится пользователь в приложении
Я работаю над проектом 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
переменная, и этот контекст должен быть смонтирован (соответствующий элемент) в дереве, когда вы делаете вызов.
В качестве альтернативы, вы можете отправить сообщение / поток из вашей сверхъестественной логики в любую часть приложения, которая имеет контекст и прослушивает поток. Отсюда вы можете вызвать диалог.