Ответ 1
Просто используйте await, после чего код в блоке "then" будет запущен после закрытия диалогового окна.
await showDialog(
//Your Dialog Code
).then((val){
Navigator.pop(_context);
});
Как обновить домашнюю страницу сразу после showDialog()
уволена /showDialog()
? Не похоже, что у него есть onDispose()
.
Нашел еще один ответ. "WillPopScope" может помочь определить, нажата ли кнопка "Назад".
Виджет, который будет использоваться в "showDialog", в его функции построения виджет может быть завернут в "возвращенный новый WillPopScope (child: ______, onWillPop: _______); Код можно запустить в функции onWillPop. Это может обновить домашнюю страницу ниже.
Просто используйте await, после чего код в блоке "then" будет запущен после закрытия диалогового окна.
await showDialog(
//Your Dialog Code
).then((val){
Navigator.pop(_context);
});
Это действительно зависит от типа обновлений, которые вы хотите иметь.
Однако это простой пример, который может помочь вам разобраться в этом.
class Home extends StatefulWidget {
@override
_HomeState createState() => new _HomeState();
}
class _HomeState extends State<Home> {
String _homeData = "initial data";
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(_homeData),
new RaisedButton(
child: new Text("Show Dialog"),
onPressed: ()async{
bool shouldUpdate = await showDialog(
context: this.context,
child:new AlertDialog(
content: new FlatButton(
child: new Text("update home"),
onPressed: () => Navigator.pop(context, true),
),
),
);
setState(() {
shouldUpdate ? this._homeData = "updated" : null;
});
},
),
],
),
),
);
}
}
Мобильные приложения обычно раскрывают свое содержимое через полноэкранные элементы, называемые "экранами" или "страницами". Во Flutter эти элементы называются маршрутами, и ими управляет виджет Navigator. Навигатор управляет стеком объектов Route и предоставляет методы для управления стеком, такие как Navigator.push
и Navigator.pop
.
showDialog(
context: context,
child: new AlertDialog(
title: const Text("Your Title"),
content: const Text(
...
Your Message
...),
actions: [
new FlatButton(
child: const Text("Ok"),
onPressed: () => Navigator.pop(context),
),
],
),
);
Вы можете проверить официальный документ
Заметил, что несколько из приведенных выше ответов были немного устаревшими из-за того, что конструкция "child", используемая с объектом AlertDialog, устарела.
Вот что я сейчас использую вместо этого для предупреждения о блокировке:
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
title: new Text("Conversation Request"),
content:
new Text("Have a conversation with this person"),
actions: <Widget>[
// usually buttons at the bottom of the dialog
new FlatButton(
child: new Text("Accept"),
onPressed: () {
performAccept();
},
),
new FlatButton(
child: new Text("Ignore"),
onPressed: () {
performIgnore();
},
)
],
);
},
)