Flutter自定义对话框插件flutter_custom_dialog的使用

Flutter自定义对话框插件flutter_custom_dialog的使用

✨ flutter_custom_dialog

pub package

[语言 ~~] 中文文档

全局对话框功能封装,以语义化的方式填充对话框内的内容,当前提供的功能包括:

  1. 支持几个语义组件方法来填充对话框内的组件内容
  2. 支持自定义语义组件,供开发者自由填充对话框内的组件内容
  3. 支持设置对话框背景色、前景色、位置、动画、点击外部消失等功能,详见下文
  4. 支持无Context调用对话框,详见下文

🎖 安装

1、安装

dependencies:
  flutter_custom_dialog: ^1.2.0

2、导入

import 'package:flutter_custom_dialog/flutter_custom_dialog.dart';

🎖 示例

dialog_demo

分割线 主体 头部与主体 列表项 列表单选按钮
进度条 进度条与主体 底部表单 通知 弹出菜单

dialog_gravity

底部 顶部 左侧 右侧 中心
左下角 左上角 右下角 右上角

dialog_animation

缩放进入 淡入 旋转进入 自定义动画

⚡ 对话框属性

对话框属性可以通过成员变量的方法调用设置,详细信息如下表所示:

YYDialog YYNoticeDialog() {
  return YYDialog().build()
    ..width = 120
    ..height = 110
    ..backgroundColor = Colors.black.withOpacity(0.8)
    ..borderRadius = 10.0
    ..showCallBack = () {
      print("showCallBack invoke");
    }
    ..dismissCallBack = () {
      print("dismissCallBack invoke");
    }
    ..widget(Padding(
      padding: EdgeInsets.only(top: 21),
      child: Image.asset(
        'images/success.png',
        width: 38,
        height: 38,
      ),
    ))
    ..widget(Padding(
      padding: EdgeInsets.only(top: 10),
      child: Text(
        "Success",
        style: TextStyle(
          fontSize: 15,
          color: Colors.white,
        ),
      ),
    ))
    ..animatedFunc = (child, animation) {
      return ScaleTransition(
        child: child,
        scale: Tween(begin: 0.0, end: 1.0).animate(animation),
      );
    }
    ..show();
}

支持的属性

属性 描述 默认值
width 对话框宽度 0
height 对话框高度 适应组件高度
duration 对话框动画时间 250ms
gravity 对话框出现的位置 center
gravityAnimationEnable 对话框出现时是否启用默认动画 false
margin 对话框的边距 EdgeInsets.all(0.0)
barrierColor 对话框屏障颜色 30%黑色
decoration 对话框装饰 null
backgroundColor 对话框背景色 白色
borderRadius 对话框圆角半径 0.0
constraints 对话框约束 无约束
animatedFunc 对话框动画 从中部弹出
showCallBack 对话框显示回调
dismissCallBack 对话框消失回调
barrierDismissible 是否通过点击外部消失 true
useRootNavigator 是否使用根导航器 true

注意:

  • 设置gravity后,如果需要动画,则应将gravityAnimationEnable设为true。
  • 如果设置了decoration属性,则backgroundColor和borderRadius不起作用;它们互斥。

支持的方法

方法 描述
show[x,y] 显示对话框
dismiss 隐藏对话框
isShowing 判断对话框是否显示

⚡ 语义化组件

对话框内部组件的内容由提前封装好的语义函数快速构建对话框,如以下表格所示:

YYDialog YYAlertDialogWithDivider(BuildContext context) {
  return YYDialog().build(context)
    ..width = 220
    ..borderRadius = 4.0
    ..text(
      padding: EdgeInsets.all(25.0),
      alignment: Alignment.center,
      text: "确定要退出登录吗?",
      color: Colors.black,
      fontSize: 14.0,
      fontWeight: FontWeight.w500,
    )
    ..divider()
    ..doubleButton(
      padding: EdgeInsets.only(top: 10.0),
      gravity: Gravity.center,
      withDivider: true,
      text1: "取消",
      color1: Colors.redAccent,
      fontSize1: 14.0,
      fontWeight1: FontWeight.bold,
      onTap1: () {
        print("取消");
      },
      text2: "确定",
      color2: Colors.redAccent,
      fontSize2: 14.0,
      fontWeight2: FontWeight.bold,
      onTap2: () {
        print("确定");
      },
    )
    ..show();
}

支持的语义组件

方法 描述
text 文本组件
doubleButton 双按钮组件
listViewOfListTile ListTile组件
listViewOfRadioButton ListRadio组件
divider 分割线组件
widget 自定义语义组件

⚡ 自定义组件

自定义对话框内部组件内容

  • 由于现有的语义组件仅辅助快速UI构建,远远不能满足实际项目开发的需求
  • 因此提供了将自定义语义组件插入对话框的能力
YYDialog YYDialogDemo(BuildContext context) {
  return YYDialog().build(context)
    ..width = 220
    ..height = 500
    ..widget(
      Padding(
        padding: EdgeInsets.all(0.0),
        child: Align(
          alignment: Alignment.centerLeft,
          child: Text(
            "",
            style: TextStyle(
              color: Colors.black,
              fontSize: 14.0,
              fontWeight: FontWeight.w100,
            ),
          ),
        ),
      ),
    )
    ..show();
}

⚡ 无Context调用

应用场景

在网络请求返回后,在回调中没有Context引用的情况下,此时需要预先初始化Context,然后可以在没有Context的情况下调用对话框。

1、初始化

在显示对话框之前调用静态方法 <code>YYDialog.init(context);</code>

class AppHome extends StatelessWidget {
  Widget build(BuildContext context) {
    //1、初始化context
    YYDialog.init(context);
    //2、后续使用可以不需要context
    return Scaffold(
      appBar: AppBar(),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            showAlertDialog(context),
            showDevelopDialog(context),
          ],
        ),
      ),
    );
  }
}

2、使用

直接使用 <code>YYDialog</code>,注意必须调用 <code>build()</code>

YYDialog YYAlertDialogBody() {
  return YYDialog().build()
    ..width = 240
    ..text(
      text: "Hello YYDialog",
      color: Colors.grey[700],
    )
    ..show();
}

🔥🔥 注意事项

1、隐藏对话框

  • 不要使用 Navigator.pop(context) 来使弹出层消失,否则会关闭页面
  • 这个问题已经在YYDialog内部解决,可以直接调用内部提供的 dismiss() 方法
var yyDialog = YYDialog();
yyDialog?.dismiss();

更多关于Flutter自定义对话框插件flutter_custom_dialog的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义对话框插件flutter_custom_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_custom_dialog插件来创建自定义对话框的示例代码。这个插件允许你创建更加灵活和美观的对话框。

首先,你需要在pubspec.yaml文件中添加flutter_custom_dialog依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_custom_dialog: ^2.0.0  # 请注意版本号,这里使用的是2.0.0,请根据实际情况调整

然后运行flutter pub get来安装依赖。

接下来,在你的Dart文件中导入flutter_custom_dialog包,并创建一个自定义对话框。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:flutter_custom_dialog/flutter_custom_dialog.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  void showCustomDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return CustomDialog(
          title: Text("自定义对话框标题"),
          content: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text("这是一个自定义对话框的内容部分。"),
                SizedBox(height: 10),
                Text("你可以在这里添加更多的信息或者控件。"),
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text("取消"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            FlatButton(
              child: Text("确定"),
              onPressed: () {
                // 在这里处理确定按钮的点击事件
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter 自定义对话框示例"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: showCustomDialog,
          child: Text("显示对话框"),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。点击按钮时,会显示一个自定义对话框。这个对话框包含标题、内容和一个动作按钮列表(取消和确定按钮)。

CustomDialogtitle属性用于设置对话框的标题,content属性用于设置对话框的内容,可以是任何Widget,这里我们使用了SingleChildScrollViewColumn来容纳多行文本。actions属性用于设置对话框底部的按钮列表。

你可以根据需要进一步自定义对话框的样式和内容。希望这个示例对你有帮助!

回到顶部