Dart 在Flatter中关闭showDialog后如何运行代码?

Dart 在Flatter中关闭showDialog后如何运行代码?,dart,flutter,Dart,Flutter,如何在showDialog()关闭/释放后更新主页?它似乎没有onDispose()函数 找到了另一个可能的答案:WillPopScope可以帮助检测是否按下了后退按钮 将在showDialog中使用的小部件,在其构建功能中,小部件可以包装在return new WillPopScope中(子项:uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu可以在onWillPop功能中运行代码。这可以更新下面的主

如何在
showDialog()
关闭/释放后更新主页?它似乎没有
onDispose()
函数

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


将在
showDialog
中使用的小部件,在其构建功能中,小部件可以包装在
return new WillPopScope中(子项:uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu可以在
onWillPop
功能中运行代码。这可以更新下面的主页。

移动应用程序通常通过称为“屏幕”或“页面”的全屏元素显示其内容。在flatter中,这些元素称为routes,它们由导航器小部件管理。导航器管理路由对象堆栈,并提供管理堆栈的方法,如
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),
                ),
              ],
            ),
        );

你可以选择它,这取决于你想要的更新类型

然而,这是一个简单的例子,可以帮助您解决这个问题

class Home扩展StatefulWidget{
@凌驾
_HomeState createState()=>new_HomeState();
}
类(HomeState扩展状态){
字符串_homeData=“初始数据”;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(_homeData),
新升起的按钮(
子项:新文本(“显示对话框”),
onPressed:()异步{
bool shouldUpdate=等待显示对话框(
context:this.context,
子:新建警报对话框(
内容:新建扁平按钮(
子项:新文本(“更新主项”),
onPressed:()=>Navigator.pop(上下文,true),
),
),
);
设置状态(){
是否应该更新?此。_homeData=“updated”:空;
});
},
),
],
),
),
);
}
}

只需使用
等待
然后
。对话框关闭后,
then
块中的代码将运行

showDialog(
  // Your Dialog Code
).then((val){
  Navigator.pop(_context);
});

注意,由于AlertDialog对象使用的“child”结构现在已被弃用,上面的几个答案有点过时

下面是我现在用于阻塞警报对话框的内容:

          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();
                    },
                  )
                ],
              );
            },
          )
showDialog(
上下文:上下文,
生成器:(BuildContext上下文){
//返回对话框类型的对象
返回警报对话框(
标题:新文本(“对话请求”),
内容:
新文本(“与此人进行对话”),
行动:[
//通常是对话框底部的按钮
新扁平按钮(
子项:新文本(“接受”),
已按下:(){
performacept();
},
),
新扁平按钮(
子项:新文本(“忽略”),
已按下:(){
performIgnore();
},
)
],
);
},
)
使用;
.whenComplete(funcName/*不是funcName()!*/)
showDialog()之后


有两种方法

  • 使用
    异步等待

    bool shouldUpdate = await showDialog<bool>(...);
    if (shouldUpdate) {
      setState(() {
        // we should update the UI
      });
    }
    

  • 如果您为您的对话框制作了另一个StatefulWidget,并且onDissmissed,那么您需要调用“dialog calling widget”中的某个函数。你可以从这个片段

    await showDialog(
          context: context,
          builder: (_) => MenuBox(),
    );
    print("now closed");
    

    如果按下手机上的“后退”按钮而不是对话框上的按钮,是否会更新以关闭对话框?是否可能使页面表现为对话框。即-(1)页面不是全屏,页面大小可以控制,并且-(2)从覆盖页面的侧面可以看到背面?所以我可以使用Navigator.pushnamed。谢谢。作为答案,我已将其添加到上述问题中。如果按下手机上的“后退”按钮,我能得到相同的结果吗?如果用户单击其中一个按钮,手机上的“后退”按钮将返回null,因此
    setState((){shouldUpdate==true | | shouldUpdate==null?这是。_homeData=“updated”:null;})
    实际上,如果用户通过单击模式外部来关闭模式,这也会导致更新主页。我认为您现在的问题更多的是UX问题,我不知道您让用户关闭对话框并仍然更新数据的用例,更新数据应该通过触发一个有意义的操作来控制,这与dismissingUse的情况不同:我正在尝试一个Flutter lib“SpriteWidget”。我有一个主“节点”,其他“精灵/节点”连接到该节点。我在“showDialog”中显示了连接节点的新排列/布局,并且可视的backpage是空白的,正如我所希望的那样。因此,当我用按钮或电话按钮关闭这个对话框时,我想运行代码来重新组装backpage布局。谢谢。感谢您提供了这个简单的解决方案。如果您正在使用wait,则不需要使用。然后()好的旧
    OnDialogDisabled
    回调仍然是preferable@bobmoff,如果我们想在调用showDialog的函数中返回值,仍然需要await@bobmoff这是对的。只要
    var-valFromDialog=wait showDialog()
    showDialog()。然后((值){//do something})
    
    bool shouldUpdate = await showDialog<bool>(...);
    if (shouldUpdate) {
      setState(() {
        // we should update the UI
      });
    }
    
    showDialog<bool>(...).then((shouldUpdate) {
      if (shouldUpdate) {
        setState(() {
          // we should update the UI
        });
      }
    });
    
    await showDialog(
          context: context,
          builder: (_) => MenuBox(),
    );
    print("now closed");