Flutter---对话框
类型AlertDialog 最常用效果图12SimpleDialog 多个选项供用户选择列表弹窗效果图(1)(2)Cupertino ios原生风格对话框效果图12CuptinoAlertDialogCupertinoTextFieldCupertinoDialogActionDialog 完全自定义内容效果图SnackBar 底部短暂显示无交互效果图BottomSheet 底部弹窗PopMenuButton注意1.弹窗最好不要叠弹窗当第一个弹窗关闭的时候要唤醒第二个弹窗第二个弹窗要放在页面里面 用Navigator.pop(context,true) (...).then( (value) if(value)(...) )AlertDialog1Futurevoid showSimpleDialog(BuildContext context) async { return showDialog( context: context, //通过参数传入 context builder: (context) { return AlertDialog( icon: Icon(Icons.warning, color: Colors.orange), //图标 title: Text(提示), //主标题 titleTextStyle: TextStyle( //主标题文字样式 color: Colors.blue, fontSize: 20, fontWeight: FontWeight.bold, ), content: Text(确定要删除吗),//副标题 contentTextStyle: TextStyle(color: Colors.red), backgroundColor: Colors.white,//背景颜色 elevation: 10, // 阴影深度 shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), side: BorderSide(color: Colors.blue, width: 2), //边距 ), actions: [ //两个按钮 TextButton( onPressed: () Navigator.pop(context), child: Text(取消), ), TextButton( onPressed: () { // TODO: 在这里添加删除逻辑 Navigator.pop(context); }, child: Text(确定), ), ], ); }, ); }2AlterDialogTextFieldTextButton //创建文本编辑控制器 //作用管理TextField的文本内容监听文本变化获取和设置文本值清空文本内容 final controller TextEditingController(); // 带输入框的对话框 void _showDeleteDialog() { showDialog( context: context, builder: (context) AlertDialog( title: const Text(请输入名称), content: TextField( //输入框区域 controller: controller, //绑定文本控制器用于管理输入内容 decoration: //输入框的装饰样式 const InputDecoration( hintText: 请输入,//占位符文本输入时消失 border: OutlineInputBorder(),//边框样式带外边框的输入框 ), ), //操作按钮区域 actions: [ TextButton( child: const Text(取消), onPressed: () Navigator.pop(context), ), TextButton( child: const Text(提交), onPressed: () { //这里写具体的提交逻辑事件 print(controller.text); Navigator.pop(context); }, ), ], ), ); }SimpleDialog1Futurevoid showSimpleDialog(BuildContext context) async { return showDialog( context: context, builder: (context) { return SimpleDialog( //标题 title: Text(选择颜色), //选项 children: [ SimpleDialogOption( onPressed: () { Navigator.pop(context, Colors.red); }, child: Text(红色), ), SimpleDialogOption( onPressed: () { Navigator.pop(context, Colors.blue); }, child: Text(蓝色), ), SimpleDialogOption( onPressed: () { Navigator.pop(context, Colors.green); }, child: Text(绿色), ), ], ); }, );2Futurevoid showSimpleDialog(BuildContext context) async { return showDialog( context: context, builder: (context) { return SimpleDialog( title: Text(选择操作), children: [ SimpleDialogOption( onPressed: () Navigator.pop(context, edit), child: Row( children: [ Icon(Icons.edit, color: Colors.blue), SizedBox(width: 10), Text(编辑), ], ), ), SimpleDialogOption( onPressed: () Navigator.pop(context, delete), child: Row( children: [ Icon(Icons.delete, color: Colors.red), SizedBox(width: 10), Text(删除), ], ), ), ], ); }, ); }DialogFuturevoid showSimpleDialog(BuildContext context) async { return showDialog( context: context, builder: (context) { return Dialog( //自定义对话框 child: Container( padding: EdgeInsets.all(20), width: 300, height: 400, child: Column( mainAxisSize: MainAxisSize.min, children: [ Text(自定义对话框, style: TextStyle(fontSize: 20)), //标题 SizedBox(height: 20), //选项 Expanded( child: ListView( children: [ ListTile(title: Text(选项1)), ListTile(title: Text(选项2)), ListTile(title: Text(选项3)), ], ), ), //按钮 Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () Navigator.pop(context), child: Text(取消), ), TextButton( onPressed: () Navigator.pop(context), child: Text(确定), ), ], ), ], ), ), ); }, ); }Cupertino1Futurevoid showSimpleDialog(BuildContext context) async { return showCupertinoDialog(//Flutter 提供的显示 iOS 风格对话框的方法 context: context,//构建上下文用于在 widget 树中定位 builder: (context) Container( margin: EdgeInsets.all(20),//外边距 child: Material( // 混合Material组件 color: Colors.transparent, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ //自定义对话框内容 ClipRRect( //对话框主题容器 borderRadius: BorderRadius.circular(14),//圆角效果 child: Container( color: CupertinoColors.systemBackground, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ //标题区域 Container( padding: const EdgeInsets.all(16), child: const Text( 退出登录, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: CupertinoColors.label, ), ), ), //内容区域 Container( padding: const EdgeInsets.all(16), child: const Text( 是否退出登录, style: TextStyle( fontSize: 16, color: CupertinoColors.secondaryLabel, ), textAlign:TextAlign.center,//文本居中对齐 ), ), //分割线 Container( height: 1, color: CupertinoColors.separator, //系统分隔线颜色 ), //按钮 Row( children: [ //取消按钮 Expanded(//让按钮平均分配可用宽度 child: CupertinoButton(//iOS 风格按钮 onPressed: () Navigator.pop(context), child: const Text( 取消, style: TextStyle( color: CupertinoColors.systemBlue, fontSize: 16, ), ), ), ), //垂直分割线 Container( width: 1, height: 44, color: CupertinoColors.separator, ), //删除按钮 Expanded( child: CupertinoButton( onPressed: (){ Navigator.pop(context); //这里加入具体的删除方法 }, child: const Text( 删除, style: TextStyle( color: CupertinoColors.systemRed, fontSize: 16, fontWeight: FontWeight.w600, ), ), ), ), ], ), ], ), ), ), ], ), ), ), ); }2CuptinoAlertDialogCupertinoTextFieldCupertinoDialogAction //创建文本编辑控制器 //作用管理TextField的文本内容监听文本变化获取和设置文本值清空文本内容 final _nameController TextEditingController(); //统一使用 Cupertino 风格 // 带输入框的对话框 void showChangeName() { showCupertinoDialog( context: context, builder: (context) { return CupertinoAlertDialog( title: const Text(修改名字), content: Card( color: Colors.transparent, elevation: 0, child: SizedBox( height: 45, child: CupertinoTextField( // 使用 Cupertino 输入框 controller: _nameController, placeholder: 请输入要修改的名字, padding: const EdgeInsets.all(10), ), ), ), actions: [ // 取消按钮 CupertinoDialogAction( child: const Text(取消), onPressed: () Navigator.pop(context), ), // 确定按钮 CupertinoDialogAction( isDefaultAction: true, // 强调样式 child: const Text(确定), onPressed: () { // 这里写具体的修改名字的逻辑 print(_nameController.text); Navigator.pop(context); }, ), ], ); }, ); }SnackBaroverride Widget build(BuildContext context) { return Scaffold( body: Container( width: 100, height: 100, margin: EdgeInsets.only(left: 50,top: 50), child: GestureDetector( onTap: (){ showSimpleDialog(context); }, child: Text(点击唤醒对话框), ) ) ); } Futurevoid showSimpleDialog(BuildContext context) async { return showDialogvoid( context: context, builder: (BuildContext dialogContext) { return StatefulBuilder( builder: (context, setState) { return AlertDialog( title: Text(选择SnackBar类型), content: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( leading: Icon(Icons.info, color: Colors.blue), title: Text(信息提示), subtitle: Text(黑色背景简单信息), onTap: () { Navigator.pop(dialogContext); _showInfoSnackBar(context); }, ), ListTile( leading: Icon(Icons.warning, color: Colors.orange), title: Text(警告提示), subtitle: Text(橙色背景警告信息), onTap: () { Navigator.pop(dialogContext); _showWarningSnackBar(context); }, ), ListTile( leading: Icon(Icons.error, color: Colors.red), title: Text(错误提示), subtitle: Text(红色背景错误信息), onTap: () { Navigator.pop(dialogContext); _showErrorSnackBar(context); }, ), ListTile( leading: Icon(Icons.download, color: Colors.purple), title: Text(加载提示), subtitle: Text(带进度条可取消), onTap: () { Navigator.pop(dialogContext); _showLoadingSnackBar(context); }, ), ], ), actions: [ TextButton( onPressed: () Navigator.pop(dialogContext), child: Text(关闭), ), ], ); }, ); }, ); } // 信息提示SnackBar void _showInfoSnackBar(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(这是一条普通信息提示),//内容 duration: Duration(seconds: 2),//显示时长 ), ); } // 警告提示SnackBar void _showWarningSnackBar(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Row( children: [ Icon(Icons.warning_amber, color: Colors.white), //图标 SizedBox(width: 8), Expanded(child: Text(警告请注意操作安全)), //文本 ], ), backgroundColor: Colors.orange[700], //背景颜色 duration: Duration(seconds: 3), //显示时长 ), ); } //错误提示SnackBar void _showErrorSnackBar(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Row( children: [ Icon(Icons.error_outline, color: Colors.white), SizedBox(width: 8), Expanded(child: Text(错误操作失败请重试)), ], ), backgroundColor: Colors.red[700], //背景颜色 duration: Duration(seconds: 3), //时长 action: SnackBarAction( //操作按钮 label: 重试, textColor: Colors.white, onPressed: () { // 执行重试操作 _showInfoSnackBar(context); }, ), ), ); } //加载提示SnackBar void _showLoadingSnackBar(BuildContext context) { final snackBar SnackBar( content: Row( children: [ CircularProgressIndicator( valueColor: AlwaysStoppedAnimationColor(Colors.white), strokeWidth: 2, ), SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text(正在处理..., style: TextStyle(fontSize: 14)), SizedBox(height: 4), LinearProgressIndicator( backgroundColor: Colors.white.withOpacity(0.3), valueColor: AlwaysStoppedAnimationColor(Colors.white), ), ], ), ), ], ), backgroundColor: Colors.purple[700], duration: Duration(seconds: 5), action: SnackBarAction( label: 取消, onPressed: () { ScaffoldMessenger.of(context).hideCurrentSnackBar(); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(操作已取消), duration: Duration(seconds: 1), ), ); }, ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); }BottomSheet//底部弹窗 void showBottomSheetDialog(BuildContext context) { showModalBottomSheet( context: context, isScrollControlled: true,//启动滚动高度 backgroundColor: Colors.transparent, // 背景透明 shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), builder: (BuildContext context) { return Container( height: 250, decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), child: Column( children: [ const SizedBox(height: 16), const Text(选择操作, style: TextStyle(fontSize: 18)), const Divider(), ListTile( leading: const Icon(Icons.edit), title: const Text(编辑), onTap: () Navigator.pop(context, edit), ), ListTile( leading: const Icon(Icons.delete), title: const Text(删除), onTap: () Navigator.pop(context, delete), ), ], ), ); }, ); }PopMenuButtonimport package:flutter/material.dart; class HomePage extends StatefulWidget { const HomePage({super.key}); override StateStatefulWidget createState() _HomePageState(); } class _HomePageState extends StateHomePage { String areaNumber 86; // 默认区号 // 区号列表 final ListMapString, String areaCodes [ {code: 86, country: 中国}, {code: 852, country: 香港}, {code: 853, country: 澳门}, {code: 886, country: 台湾}, {code: 1, country: 美国}, {code: 81, country: 日本}, {code: 82, country: 韩国}, {code: 44, country: 英国}, {code: 61, country: 澳大利亚}, {code: 65, country: 新加坡}, {code: 60, country: 马来西亚}, {code: 66, country: 泰国}, {code: 84, country: 越南}, {code: 33, country: 法国}, {code: 49, country: 德国}, {code: 39, country: 意大利}, {code: 7, country: 俄罗斯}, {code: 55, country: 巴西}, {code: 52, country: 墨西哥}, ]; override Widget build(BuildContext context) { return Scaffold( body: Center( child:PopupMenuTheme( data: PopupMenuThemeData( //设置弹出菜单的样式 color: Colors.blue.withOpacity(0.5), // 设置弹出菜单的背景颜色 elevation: 8, // 阴影高度 shape: RoundedRectangleBorder( // 设置形状 borderRadius: BorderRadius.circular(12), ), textStyle: TextStyle( // 设置文本样式 color: Colors.white, fontSize: 14, ), ), child: PopupMenuButtonString( // 点击时弹出菜单 onSelected: (String value) { setState(() { areaNumber value; // 更新选择的区号 }); }, // 菜单的位置 - 显示在按钮下方 position: PopupMenuPosition.under, // 创建菜单项 itemBuilder: (BuildContext context) { return areaCodes.map((area) { return PopupMenuItemString( value: area[code], //标识每个选项的唯一身份当选项选中时把这个值传递给onSelected child: Row( children: [ //左侧的区号 Text( area[code]!, style: TextStyle(fontWeight: FontWeight.bold), ), SizedBox(width: 8), //右侧的国家 Text( area[country]!, style: TextStyle(color: Colors.grey[600]), ), ], ), ); }).toList(); }, // 按钮的child - 被点击的容器 child: Container( height: 57, width: 100, decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(12) ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( areaNumber, style: TextStyle(color: Colors.white), ), Icon( Icons.keyboard_arrow_down, color: Colors.white, ) ], ), ), ), ) ), ); } }

相关新闻

【数据结构】Java对象的比较

【数据结构】Java对象的比较

文章目录一、Java对象比较的痛点1.1 基本类型:直接比较,简单直接1.2 引用类型二、Java对象的三种比较方式2.1 方式一:覆写Object的equals方法2.2 方式二:实现Comparable接口2.3 方式三:实现Comparator接口三种比较方式…

2026/7/19 16:57:33阅读更多 →
OmenSuperHub:彻底掌控你的惠普游戏本性能,告别官方软件限制

OmenSuperHub:彻底掌控你的惠普游戏本性能,告别官方软件限制

OmenSuperHub:彻底掌控你的惠普游戏本性能,告别官方软件限制 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuper…

2026/7/19 16:55:33阅读更多 →
3步魔法:用GitHub免费将Linux应用变身iOS安装包

3步魔法:用GitHub免费将Linux应用变身iOS安装包

3步魔法:用GitHub免费将Linux应用变身iOS安装包 【免费下载链接】deb-to-ipa ▶️ Convert an application from a deb to an IPA with a GitHub workflow. 项目地址: https://gitcode.com/gh_mirrors/de/deb-to-ipa 你是否曾经遇到过这样的困境:…

2026/7/19 16:55:33阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →