对全局弹窗的功能封装,用语义化的方式对弹窗内部的内容进行填充,目前提供的功能
- 支持少数语义化组件的方法,填充弹窗内部的组件内容
- 支持自定义语义化组件的方法,供开发者自由填充弹窗内部的组件内容
- 支持设置弹窗背景色、前景色、位置、动画、点击外部消失等功能,具体看下文
- 支持无Context调用弹窗,具体看下文
1、install
dependencies:
flutter_custom_dialog: ^1.3.0
2、import
import 'package:flutter_custom_dialog/flutter_custom_dialog.dart';
dialog_demo
divider ✅ |
body ✅ |
head&body ✅ |
listTile ✅ |
ListRadio ✅ |
progress ✅ |
progress&body ✅ |
notice ✅ |
bottom sheet ✅ |
pop menu ✅ 支持自定义位置 |
dialog_gravity
bottom ✅ |
top ✅ |
left ✅ |
right ✅ |
center ✅ |
left bottom ✅ |
left top ✅ |
right bottom ✅ |
right top ✅ |
dialog_animation
scaleIn ✅ |
fadeIn ✅ |
rotateIn ✅ |
customIn ✅ 支持自定义动画 |
弹窗的属性设置可以通过成员变量的方法去调用,具体详见下表
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();
}
支持的属性
property | description | default |
---|---|---|
width | 弹窗宽度 | 0 |
height | 弹窗高度 | 自适应组件高度 |
duration | 弹窗动画出现的时间 | 250毫秒 |
gravity | 弹窗出现的位置 | 居中 |
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不生效,他们是互斥关系
支持的方法
method | description |
---|---|
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();
}
支持的语义化组件
method | description |
---|---|
text | 文本控件 |
doubleButton | 双按钮控件 |
listViewOfListTile | 列表Tile组件 |
listViewOfRadioButton | 列表按钮组件 |
divider | 分割线组件 |
widget | 自定义语义化组件 |
自定义弹窗内部组件内容
- 由于当前已有的语义化组件只是辅助快速搭建UI,在实际项目开发中远远不能满足需求
- 所以提供了自定义语义化组件的插入,由开发者自行将组件加入到弹窗内
通过
widget()
将组件插入弹窗
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调用弹窗
1、init
在未弹窗之前先调用静态方法YYDialog.init(context);
class AppHome extends StatelessWidget {
Widget build(BuildContext context) {
//1、初始化context
YYDialog.init(context);
//2、后续使用可以不需要context
......
}
}
2、use
直接使用YYDialog
,注意必须要调用build()
YYDialog YYAlertDialogBody() {
return YYDialog().build()
..width = 240
..text(
text: "Hello YYDialog",
color: Colors.grey[700],
)
..show();
}
1、dismiss
- 请勿擅自使用
Navigator.pop(context)
让弹窗消失,否则会关掉自己的页面 - YYDialog内部已经解决了此问题,调用内部提供的
dismiss()
即可
var yyDialog = YYDialog();
yyDialog?.dismiss();
- If your application has problems, please submit your code and effect to Issue.
- Pull request are also welcome.
- QQ:510402535
- QQ群:798874340
- e-mail:[email protected]
- g-mail:[email protected]
- Blog:http://blog.csdn.net/qq_30379689
- Github:https://github.com/AndroidHensen
Apache License 2.0