Dialog
注意,本文使用的是Flutter原生的Material风格Dialog和iOS风格的Dialog
在pub.dev中有其它风格的Dialog,参加其开发者文档
参数传递
注意,如果你需要在某个函数中实现showDialog
方法,需要传递一个context参数:BuildContext context
,理论上如果没有手动传递这个参数,Flutter会寻找上下文中最近的context,但是不建议这样使用,务必在使用的时候添加上这样的参数
void dialogFunction(BuildContext context){
showDialog(
context: context,
// 其它内容...
);
}
Material Dialog
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('提示'),
content: Text('这是一个对话框'),
actions: <Widget>[
ElevatedButton(
onPressed: () {
// 点击取消之后的操作
Navigator.pop(context);
},
child: Text("取消")
),
FilledButton(
onPressed: () async {
// 点击确定之后的操作
Navigator.pop(context);
},
child: Text("确定")
),
],
);
},
);
iOS Dialog
showDialog(
context: context,
builder: (context) {
return CupertinoAlertDialog(
title: Text('提示'),
content: Text('这是一个iOS风格的对话框'),
actions: <Widget>[
CupertinoDialogAction(
child: Text('取消'),
onPressed: () {
// 点击取消之后的操作
Navigator.pop(context);
},
),
CupertinoDialogAction(
child: Text('确定'),
onPressed: () {
// 点击确定之后的操作
Navigator.pop(context);
},
),
],
);
},
);
在Dialog
中使用setState
showDialog(
context: context,
builder: (BuildContext context)=>AlertDialog(
title: /** 标题 */,
content: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
// ...
},
),
actions: [
// ...
]
),
);
在initState
中使用
注意,如果直接调用showDialog
会报错
@override
void initState(){
// ...错误的用法
showDialog(
// ...
)
}
如果需要在App打开的时候调用,需要使用回调函数,等待context
加载完成
@override
void initState(){
WidgetsBinding.instance.addPostFrameCallback((_) {
showDialog(
context: context,
builder: (BuildContext context)=>AlertDialog(
// ...其他内容
)
);
});
}