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

这篇具有很好参考价值的文章主要介绍了【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,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: <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 和 web
                  backgroundColor: Colors.black26, //背景颜色
                  textColor: Colors.white,   //文本颜色
                  fontSize: 16.0  //文本字体大小
              );

4.2 自定义

4.2.1 说明

        所谓toast框其实就是在图层的最上面一层插入一个显示图层,在Flutter中利用OverLayEntry构建图层,然后通过Overlay进行插入文章来源地址https://www.toymoban.com/news/detail-727355.html

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<ToastWidget> createState() => _ToastState();
}

class _ToastState extends State<ToastWidget> 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)
                  ),
                )
            )
          ],
        ),

      ),
    );
  }
}

到了这里,关于【Flutter入门到进阶】Flutter基础篇---弹窗Dialog的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter 实战:构建跨平台应用

    Flutter是由Google开发的一款开源移动应用开发框架,它可以帮助开发者在iOS和Android平台上快速、高效地开发应用。Flutter使用Dart语言作为开发语言,具有跨平台兼容性高、开发效率快、性能优异等特点。本文将通过实战案例,介绍如何使用Flutter构建跨平台应用。 在开始Flutte

    2024年02月05日
    浏览(224)
  • Flutter:构建跨平台应用的未来选择

    随着移动设备的普及和技术的不断发展,跨平台移动应用开发成为了一个热门的需求。Flutter作为一款由Google开发的开源移动应用开发框架,受到了越来越多的关注。本文将带你了解Flutter的优势、应用场景以及如何使用Flutter进行开发。 一、Flutter的优势 1.跨平台:Flutter使用

    2024年02月09日
    浏览(70)
  • Flutter实现Service + UI 全面跨平台

    作者:Karl_wei Flutter作为跨平台的UI框架,其可行性已经被市场所认可。UI跨端后,我们自然会希望一些运行在 终端的小服务也能跨端 ,特别是当这个小服务还涉及到一些 UI 的展示。 我们希望Flutter能承担这个角色,让其跨端能力更进一步。 我们希望在整机设备上,运行一个

    2024年02月12日
    浏览(51)
  • Flutter:跨平台移动应用开发的未来

    Flutter的背景和概述 Flutter是由Google开发的一个开源UI工具包,用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布,并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来构建用户界面,通过使用自绘UI技术,可以实现高性能的跨平台应用开发。 Fl

    2024年01月22日
    浏览(100)
  • 【Flutter -- 基础】快速入门 Flutter

    一、Flutter 介绍 Flutter app 使用了 Dart 语言,源自于 Google,现在是 ECMA 的标准。Dart 吸收了许多现代语言的特性,比如 Kotlin 和 Swift,同时能被转译成 js 代码。 作为一个跨平台框架,Flutter 和 React Native 非常像,因为 Flutter 支持响应式和声明式语法。但和 React Native 不同,Flutt

    2024年02月02日
    浏览(39)
  • 开发跨平台APP,是用Flutter还是React Native开发框架?

     随着移动互联网的飞速发展,对于开发人员而言,如何快速地开发出兼容不同平台(iOS、Android)的应用,成为了一个重要的问题。 跨平台应用程序开发框架的好处: 1. 一个App适用于多个设备; 2. 一个App适用于多个平台; 3. 一个App可以在多个应用商店中发布; 4. 只需编写

    2024年02月15日
    浏览(77)
  • Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

    Flutter 平台(Platform)是一个概念,用于描述 Flutter 框架在不同操作系统(如Android、iOS、Web、macOS、Windows等)上运行时的适应性和支持。Flutter 旨在实现跨平台开发,使开发人员能够使用单一代码库构建应用程序,然后在多个平台上运行,而无需编写平台特定的代码。以下是有

    2024年02月08日
    浏览(64)
  • 【Flutter跨平台插件开发】如何实现kotlin跟C++的相互调用

    在 Kotlin 中,可以使用 JNI (Java Native Interface) 来调用 C++ 代码 调用步骤: 创建 C++ 文件并实现函数。 在 Kotlin 中声明需要调用的 native 函数并加载 native 库。 调用示例 Flutter 插件项目的例子 在 Flutter 插件中引用已有的 C++ 源码需要以下步骤: 首先,在 Flutter 插件的 android 目录下

    2024年01月25日
    浏览(65)
  • Flutter:引领移动开发新潮流,跨平台应用程序的终极解决方案

    Flutter是由Google开发的一款开源移动应用开发框架,它可以帮助开发者快速高效地构建跨平台的移动应用程序。Flutter基于Dart编程语言,具有简单易学、高效灵活的特点,并且可以与现有的Android和iOS应用进行集成。本文将介绍Flutter的基本概念、开发环境搭建、基础组件、生命

    2024年02月04日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包