我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【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 示例

// 自定义dialogclass MyDialog extends Dialog {  String title;  String content;  Function()? onClosed;  MyDialog({Key? key, required this.title,required  this.onClosed,this.content=""}) : super(key: key);  @override  Widget build(BuildContext context) {    return Material(      type: MaterialType.transparency,      child: Center(          child: Container(            height: 300,            width: 300,            color: Colors.white,            child: Column(              children: [                Padding(                  padding: const EdgeInsets.all(10),                  child: Stack(                    children: [                      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 和 web                  backgroundColor: 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中插入插入OverlayEntry    Overlay.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});  @override  State createState() => _ToastState();}class _ToastState extends State with SingleTickerProviderStateMixin {  late AnimationController _controller;  @override  void initState() {    _controller = AnimationController(      vsync: this,      duration: const Duration(seconds: 1),    );  }  @override  void dispose() {    _controller.dispose();    super.dispose();  }  @override  Widget 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)                  ),                )            )          ],        ),      ),    );  }}

来源地址:https://blog.csdn.net/u010687761/article/details/129358724

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux Systemd Crontab入门教程:从基础到进阶

Crontab是一个用于在Linux系统上定时执行任务的工具。它基于时间表来安排任务执行,可以自动执行重复性的任务,比如备份文件、生成报告等。本教程将引导您从基础到进阶了解Linux Systemd Crontab的使用。我们将涵盖以下主题
2023-10-09

《Java 入门教程:从基础到进阶》(field java入门教程是什么 )

在Java编程的世界里,对于初学者来说,找到一个清晰易懂的入门教程至关重要。本文将为你详细介绍Java入门教程的相关内容,帮助你快速踏入Java编程的大门。一、为什么选择Java?Java是一种广泛应用于企业级开
《Java 入门教程:从基础到进阶》(field java入门教程是什么  )
Java2024-12-20

VUE Mixins 入门指南:从基础概念到进阶技巧,一网打尽

Vue Mixins 入门指南:快速提升代码复用率与开发效率 Vue.js Mixins、代码复用、组件化开发
VUE Mixins 入门指南:从基础概念到进阶技巧,一网打尽
2024-02-13

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录