Flutter是一个用于构建跨平台应用的开源框架,它提供了丰富的组件和工具,让开发者可以快速地创建美观和高性能的用户界面。在Flutter中,我们经常会使用Dialog组件来显示一些提示信息或者让用户做出选择。例如,我们可以使用AlertDialog来显示一个带有标题、内容和按钮的对话框,让用户确认或者取消某个操作。
但是,如果我们想要在Dialog关闭后获取用户的选择结果,该怎么做呢?一种常见的做法是使用showDialog函数来显示Dialog,并且在按钮的onPressed回调中调用Navigator.pop函数来关闭Dialog,并传递一个结果值。例如:
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('提示'),
content: Text('您确定要删除这条记录吗?'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.pop(context, false); // 关闭Dialog并传递false值
},
child: Text('取消'),
),
FlatButton(
onPressed: () {
Navigator.pop(context, true); // 关闭Dialog并传递true值
},
child: Text('确定'),
),
],
),
);
然后,在showDialog函数的外部,我们可以使用await关键字来等待Dialog的返回值,并根据返回值来执行相应的逻辑。例如:
bool result = await showDialog(...); // 等待Dialog的返回值
if (result) {
// 用户点击了确定按钮,执行删除操作
} else {
// 用户点击了取消按钮,不执行删除操作
}
这种做法看起来很简单,但是有一个潜在的问题。那就是当用户没有点击任何按钮,而是直接点击了对话框外部的区域或者按下了返回键来关闭对话框时又或者其他token超时触发的pop()有其他类型返回值,showDialog函数会返回一个null值或者其他对象。这时候,如果我们直接使用if (!result)来判断用户是否取消了操作,就会抛出一个异常,因为null或者其他对象不能转换为布尔类型。
为了避免这个问题,我们需要在判断result之前先检查它是否是bool类型。例如:
bool result = await showDialog(...); // 等待Dialog的返回值
if(result is! bool) return;//先判断类型
if (!result) {
// 用户点击了取消按钮或者没有点击任何按钮,不执行删除操作
} else {
// 用户点击了确定按钮,执行删除操作
}
这样就可以避免因为null值而导致的异常。