Flutter学习日记之自定义封装Dialog

Posted Android_小黑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter学习日记之自定义封装Dialog相关的知识,希望对你有一定的参考价值。

本文地址:https://blog.csdn.net/qq_40785165/article/details/118035843,转载需附上此地址

大家好,我是小黑,一个还没秃头的程序员~~~

海到无边天作岸,山登绝顶我为峰。

今天分享的内容是关于Dialog的封装自定义,源码地址:https://gitee.com/fjjxxy/flutter-study.git,效果如下:

源码项目中这个Dialog的类是CommonDialog,参数如下:

参数说明
title标题
titleStyle标题文字的样式
content内容
contentStyle内容样式
cancelText取消按钮的文字
confirmText确认按钮的文字
onConfirm确认的点击事件
onCancel取消的点击事件
cancelBtnStyle取消按钮的样式
confirmBtnStyle确认按钮的样式
cancelTextStyle取消按钮的文字样式
confirmTextStyle确认按钮的文字样式
imageNetUrl顶部图片的网络地址
imageAssetsUrl顶部图片的本地地址

注:imageNetUrl与imageAssetsUrl不能同时出现,断言如下:

assert(!(imageNetUrl != null && imageAssetsUrl != null))

构造函数如下:两个点击事件是必选的参数

  CommonDialog(
      {@required this.onConfirm,
      @required this.onCancel,
      this.title = "提示",
      this.content = "",
      this.titleStyle,
      this.contentStyle,
      this.cancelText = "取消",
      this.confirmText = "确定",
      this.cancelBtnStyle,
      this.confirmBtnStyle,
      this.cancelTextStyle,
      this.confirmTextStyle,
      this.imageNetUrl,
      this.imageAssetsUrl})
      : assert(!(imageNetUrl != null && imageAssetsUrl != null));

完整的对话组件的代码如下:

class CommonDialog extends Dialog {
  var title;
  var titleStyle;
  var content;
  var contentStyle;
  var cancelText;
  var confirmText;
  var onConfirm;
  var onCancel;
  var cancelBtnStyle;
  var confirmBtnStyle;
  var cancelTextStyle;
  var confirmTextStyle;
  var imageNetUrl;
  var imageAssetsUrl;

  CommonDialog(
      {@required this.onConfirm,
      @required this.onCancel,
      this.title = "提示",
      this.content = "",
      this.titleStyle,
      this.contentStyle,
      this.cancelText = "取消",
      this.confirmText = "确定",
      this.cancelBtnStyle,
      this.confirmBtnStyle,
      this.cancelTextStyle,
      this.confirmTextStyle,
      this.imageNetUrl,
      this.imageAssetsUrl})
      : assert(!(imageNetUrl != null && imageAssetsUrl != null));

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Material(
      type: MaterialType.transparency, //透明类型
      child: Center(
        child: Container(
          height: 250,
          width: double.infinity,
          margin: EdgeInsets.fromLTRB(20, 0, 20, 0),
          decoration: BoxDecoration(
            color: ColorUtils.color_white,
            borderRadius: BorderRadius.circular(10),
            border: Border.all(color: ColorUtils.color_white),
          ),
          child: Padding(
            padding: EdgeInsets.all(20),
            child: Column(
              children: [
                imageAssetsUrl == null
                    ? imageNetUrl != null
                        ? Image.network(
                            imageNetUrl,
                            width: 40,
                            height: 40,
                          )
                        : SizedBox(
                            height: 0,
                          )
                    : Image.asset(
                        imageAssetsUrl,
                        width: 40,
                        height: 40,
                      ),
                imageAssetsUrl != null || imageNetUrl != null
                    ? SizedBox(
                        height: 20,
                      )
                    : SizedBox(
                        height: 0,
                      ),
                Text(
                  "$title",
                  style: this.titleStyle ??
                      TextStyle(fontSize: 20, color: Colors.black),
                ),
                SizedBox(
                  height: 20,
                ),
                Expanded(
                    child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                      Expanded(
                          child: Text(
                        "$content",
                        style: this.contentStyle ??
                            TextStyle(fontSize: 15, color: Colors.black),
                      ))
                    ])),
                Container(
                  width: double.infinity,
                  padding: EdgeInsets.fromLTRB(20, 0, 20, 0),
                  child: Row(
                    children: [
                      Container(
                        height: 40,
                        width: 100,
                        child: OutlinedButton(
                            onPressed: onCancel,
                            child: Text(
                              "$cancelText",
                              style: cancelTextStyle ?? TextStyle(fontSize: 15),
                            ),
                            style: cancelBtnStyle ??
                                ButtonStyle(
                                    foregroundColor: MaterialStateProperty.all(
                                        ColorUtils.color_blue_0C84FF),
                                    backgroundColor: MaterialStateProperty.all(
                                        ColorUtils.color_blue_EEF6FF),
                                    shape: MaterialStateProperty.all(
                                        RoundedRectangleBorder(
                                            borderRadius:
                                                BorderRadius.circular(20))),
                                    side: MaterialStateProperty.all(BorderSide(
                                        color: ColorUtils.color_white)))),
                      ),
                      Expanded(child: Text("")),
                      Container(
                        height: 40,
                        width: 100,
                        child: OutlinedButton(
                            onPressed: onConfirm,
                            child: Text(
                              "$confirmText",
                              style:
                                  confirmTextStyle ?? TextStyle(fontSize: 15),
                            ),
                            style: confirmBtnStyle ??
                                ButtonStyle(
                                    foregroundColor: MaterialStateProperty.all(
                                        ColorUtils.color_white),
                                    backgroundColor: MaterialStateProperty.all(
                                        ColorUtils.color_blue_0C84FF),
                                    shape: MaterialStateProperty.all(
                                        RoundedRectangleBorder(
                                            borderRadius:
                                                BorderRadius.circular(20))),
                                    side: MaterialStateProperty.all(BorderSide(
                                        color: ColorUtils.color_white)))),
                      )
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

如何使用?

                showDialog(
                    context: context,
                    builder: (context) {
                      return CommonDialog(
                        title: "温馨提示",
                        titleStyle:
                            TextStyle(color: Colors.black, fontSize: 20),
                        content: "公共场所请勿抽烟",
                        contentStyle:
                            TextStyle(color: Colors.black, fontSize: 15),
                        confirmText: "下一步",
                        cancelText: "取消",
                        onCancel: () {
                          Toast.toast(context, msg: "取消");
                          Navigator.pop(context);
                        },
                        onConfirm: () {
                          Toast.toast(context, msg: "确定");
                          Navigator.pop(context);
                        },
                        cancelBtnStyle: ButtonStyle(
                            foregroundColor: MaterialStateProperty.all(
                                ColorUtils.color_blue_0C84FF),
                            backgroundColor: MaterialStateProperty.all(
                                ColorUtils.color_blue_EEF6FF),
                            shape: MaterialStateProperty.all(
                                RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(20))),
                            side: MaterialStateProperty.all(
                                BorderSide(color: ColorUtils.color_white))),
                        confirmBtnStyle:                                 ButtonStyle(
                            foregroundColor: MaterialStateProperty.all(
                                ColorUtils.color_white),
                            backgroundColor: MaterialStateProperty.all(
                                ColorUtils.color_blue_0C84FF),
                            shape: MaterialStateProperty.all(
                                RoundedRectangleBorder(
                                    borderRadius:
                                    BorderRadius.circular(20))),
                            side: MaterialStateProperty.all(BorderSide(
                                color: ColorUtils.color_white))),
                        cancelTextStyle: TextStyle(fontSize: 15),
                        confirmTextStyle: TextStyle(fontSize: 15),
                        // imageNetUrl: "https://profile.csdnimg.cn/D/6/7/0_qq_40785165",
                        imageAssetsUrl: "assets/images/icon_warn.png",
                      );
                    });

以上的参数除了事件以外可以不定义,代码仅供参考
到此为止,封装的对话框就可以拿来用了,要是觉得有用记得点个赞,感兴趣的小伙伴可以下载源码看一下,希望大家可以点个Star,支持一下小白的flutter学习经历,最后,希望喜欢我文章的朋友们可以帮忙点赞、收藏,也可以关注一下,如果有问题可以在评论区提出,后面我会持续更新Flutter的学习记录,与大家分享,谢谢大家的支持与阅读!

以上是关于Flutter学习日记之自定义封装Dialog的主要内容,如果未能解决你的问题,请参考以下文章

Flutter学习日记之Dialog的使用

Flutter学习日记之Http&Dio网络请求的使用与封装

Flutter 自定义弹窗组件

Flutter 按钮组件 底部导航 浮动按钮 Swiper 自定义Dialog

Flutter弹窗弹窗的快速上手使用和自定义Dialog

Flutter之自定义按钮RaisedButtonOutlineButtonIconButton等——Flutter基础系列