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");