当前位置: 首页 > news >正文

【Flutter入门到进阶】Flutter基础篇---弹窗Dialog

1 AlertDialog

1.1 说明

        最简单的方案是利用AlertDialog组件构建一个弹框

1.2 示例

void alertDialog(BuildContext context) async {var result = await showDialog(barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框context: context,builder: (context) {return AlertDialog(title: const Text("提示信息!"),content: const Text("您确定要删除吗"),actions: [TextButton(onPressed: () {print("ok");Navigator.of(context).pop("ok"); //点击按钮让AlertDialog消失},child: const Text("确定")),TextButton(onPressed: () {print("cancel");Navigator.of(context).pop("取消");},child: const Text("取消"))],);});print("-----------");print(result);
}

2 SimpleDialog

2.1 说明

        通过SimpleDialog构建一个选择框

2.2 示例

void simpleDialog(BuildContext context) async {var result = await showDialog(barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框context: context,builder: (context) {return SimpleDialog(title: const Text("请选择语言"),children: [SimpleDialogOption(onPressed: () {print("汉语");Navigator.pop(context, "汉语");},child: const Text("汉语"),),const Divider(),SimpleDialogOption(onPressed: () {print("英语");Navigator.pop(context, "英语");},child: const Text("英语"),),const Divider(),SimpleDialogOption(onPressed: () {print("日语");Navigator.pop(context, "日语");},child: const Text("日语"),),const Divider(),],);});print("-----------");print(result);
}

3 自定义Flutter Dialog 

3.1 说明

        通过继承Dialog实现自定义的弹窗

3.2 示例

// 自定义dialog
class MyDialog extends Dialog {String title;String content;Function()? onClosed;MyDialog({Key? key, required this.title,requiredthis.onClosed,this.content=""}) : super(key: key);@overrideWidget build(BuildContext context) {return Material(type: MaterialType.transparency,child: Center(child: Container(height: 300,width: 300,color: Colors.white,child: Column(children: <Widget>[Padding(padding: const EdgeInsets.all(10),child: Stack(children: <Widget>[Align(alignment: Alignment.center,child: Text(title),),Align(alignment: Alignment.centerRight,child: InkWell(onTap: onClosed,child: const Icon(Icons.close),),)],),),const Divider(),Container(padding: const EdgeInsets.all(10),width: double.infinity,child: Text(content,textAlign: TextAlign.left),)],),)),);}
}

4 Flutter Toast

4.1 第三方框架

4.1.1 说明        

        https://pub.dev/packages/fluttertoast

4.1.2 示例

Fluttertoast.showToast(msg: "提示信息",toastLength: Toast.LENGTH_LONG,   //值针对 android 平台timeInSecForIosWeb: 1,  //提示时间 针对ios 和 webbackgroundColor: Colors.black26, //背景颜色textColor: Colors.white,   //文本颜色fontSize: 16.0  //文本字体大小);

4.2 自定义

4.2.1 说明

        所谓toast框其实就是在图层的最上面一层插入一个显示图层,在Flutter中利用OverLayEntry构建图层,然后通过Overlay进行插入

4.2.2 示例

import 'package:flutter/material.dart';class Toast {static var _lastMsg;static int _lastShowms = 0;static get flag => true;static OverlayEntry? entry;static Future _show(BuildContext context, String msg, int duration) {entry = OverlayEntry(builder: (BuildContext context) => Positioned(//top值,可以改变这个值来改变toast在屏幕中的位置top: MediaQuery.of(context).size.height.toDouble() * 0.5,child: Container(alignment: Alignment.center,width: MediaQuery.of(context).size.width,child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0),child: ToastWidget(msg: "test",duration: duration,),// child: _buildToastWidget(context,msg),)),),);///往Overlay中插入插入OverlayEntryOverlay.of(context)?.insert(entry!);///两秒后,移除Toast// Future result = Future.delayed(Duration(milliseconds: duration)).then((value) {//   print("移除....");//   entry!.remove();// });// return result;return Future(() => 0);}//toast UI绘制static _buildToastWidget(context, String msg) {return Row(mainAxisSize: MainAxisSize.min,children: [Container(alignment: Alignment.center,decoration: BoxDecoration(borderRadius: BorderRadius.circular(12.0),shape: BoxShape.rectangle,color: Colors.black45,),child: Padding(padding: const EdgeInsets.all(10),child: Text(msg,style: const TextStyle(color: Colors.white,decoration: TextDecoration.none,fontSize: 14)),))],);}//处理重复多次点击static void _handleDuplicateAndShow(String message, BuildContext context, int duration) {if (_lastMsg == message) {//相同信息内容int currentms = DateTime.now().millisecondsSinceEpoch;int interval = currentms - _lastShowms;if (interval > duration) {//大于时间间隔 可以显示_show(context, message, duration);_lastShowms = currentms;}} else {_show(context, message, duration);_lastMsg = message;}}/// 提示static void showInfo(String message, {required BuildContext context, int duration = 2000}) {_handleDuplicateAndShow(message, context, duration);}
}class ToastWidget extends StatefulWidget {String msg;int duration;ToastWidget({super.key,required this.msg,required this.duration});@overrideState<ToastWidget> createState() => _ToastState();
}class _ToastState extends State<ToastWidget> with SingleTickerProviderStateMixin {late AnimationController _controller;@overridevoid initState() {_controller = AnimationController(vsync: this,duration: const Duration(seconds: 1),);}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {//启动正序一次Future((){print("启动动画...");_controller.forward();}).then((value) {//结束倒叙一次Future.delayed(Duration(milliseconds: widget.duration-2)).then((value) async{print("启动结束动画...");await _controller.reverse();//移除图层Toast.entry!.remove();print("移除图层...");});});print("构建组件");return Center(child: FadeTransition(opacity: _controller,child:Row(mainAxisSize: MainAxisSize.min,children: [Container(alignment: Alignment.center,decoration: BoxDecoration(borderRadius: BorderRadius.circular(12.0),shape: BoxShape.rectangle,color: Colors.black45,),child: Padding(padding: const EdgeInsets.all(10),child: Text(widget.msg,style: const TextStyle(color: Colors.white,decoration: TextDecoration.none,fontSize: 14)),))],),),);}
}
http://www.lryc.cn/news/32069.html

相关文章:

  • 【操作系统】进程和线程的区别
  • Linux开发环境配置--正点原子阿尔法开发板
  • Android ThreadPoolExecutor的基本使用
  • 基于区域生长和形态学处理的图像融合方法——Matlab图像处理
  • 三个案例场景带你掌握Cisco交换机VLAN互通
  • 小白入门之持久连接与非持久连接的差别
  • TypeScript篇.01-简介,类,接口,基础类型
  • 分享几种WordPress怎么实现相关文章功能
  • PANGO的IOB的电平能力那些事
  • scrpy学习-02
  • MySQL运维篇之Mycat分片规则
  • vue router elementui template CDN模式实现多个页面跳转
  • ElasticSearch - ElasticSearch基本概念及集群内部原理
  • 【反射中,Class.forName和ClassLoader区别】
  • 2023了为什么还有人在问:女生适合做跨境电商吗?
  • 磁盘分区和挂载
  • 电子技术——晶体管尺寸
  • Tuxera NTFS2023MacOS读写软件功能介绍使用
  • 2022年数维杯国际大学生数学建模挑战赛A题自动地震地平线跟踪解题全过程论文及程序
  • 推荐系统[八]:推荐系统常遇到问题和解决方案[物品冷启动问题、多目标平衡问题、数据实时性问题等]
  • shutil.copyfile PermissionError: [Errno 13] Permission denied
  • 07react+echart,大屏代码开发
  • 【数据库原理复习】ch2 SQL语句(主要基于sql server)
  • Cadence Allegro 导出Component Pin Report详解
  • PAT甲级 1110 Complete Binary Tree
  • 【JavaSE】逻辑控制语句
  • Motionbuilder系统文件说明
  • 【我的Android开发】AMS中Activity栈管理
  • C++源程序的构成————学习笔记
  • Spark Catalyst