如何在Flutter中解除showDialog之后的运行代码?

Ant*_*t D 12 dart flutter

如何在showDialog()被解雇/处置后更新主页?似乎它没有onDispose()功能.

找到另一个可能的答案:'WillPopScope'可以帮助检测后退按钮是否被按下.

将在'showDialog'中使用的小部件,在其构建函数中,小部件可以包含在'return new WillPopScope(child:______,onWillPop:_______)中; 代码可以在'onWillPop'函数中运行.这可以更新下面的主页.

Jal*_*tre 28

Simply use await and then, the code in "then" block will run after the dialog is dismissed

await showDialog(
       //Your Dialog Code
).then((val){
    Navigator.pop(_context);
});
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是await,则无需使用.then().. :) (8认同)
  • 好的旧的“onDialogDismissed”回调仍然会更好 (6认同)
  • @bobmoff 是对的。只需 `var valFromDialog = wait showDialog()` 或 `showDialog().then((value) { // do Something});` (2认同)

azi*_*iza 10

这实际上取决于您想要的更新类型.

但是,这是一个可以帮助您解决问题的简单示例.

在此输入图像描述

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;
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您为 DialogBox 和 onDissmissed 制作了另一个 StatefulWidget,您希望在“对话框调用小部件”中调用一些函数。你可以用这个片段。

await showDialog(
      context: context,
      builder: (_) => MenuBox(),
);
print("now closed");
Run Code Online (Sandbox Code Playgroud)


Ekt*_*sar 5

移动应用程序通常通过称为“屏幕”或“页面”的全屏元素来显示其内容。在Flutter中,这些元素称为路由,由Navigator小部件管理。导航器管理Route对象的堆栈,并提供用于管理堆栈的方法,例如Navigator.pushNavigator.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),
                ),
              ],
            ),
        );
Run Code Online (Sandbox Code Playgroud)

您可以检查官方文件


Wes*_*nes 5

当点击对话框外部时,返回值为 null,因此我预计可能为 null 并检查 null,结果为 false。

onPressed: () async {
bool? result = await showDialog(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(
      title: Text('Select Entity'),
      content: setupAlertDialogContainer(),
    );
  },
);
if (result ?? false) {
  doWhatYouNeedTo();
}
Run Code Online (Sandbox Code Playgroud)