Flutter怎么自定义一个对话框
2022-07-29 本文已影响0人
码农朱同学
Flutter怎么自定义一个对话框?怎么调用?
正好我刚写完一个隐私协议对话框,要求同意协议前,不初始化第三方SDK,当协议更新时也需要再次弹出弹框。
class DialogUtils {
///隐私 弹框
static showPrivacyDialog(BuildContext _context,
{Function(String)? policyCallback,
VoidCallback? confirmCallback,
VoidCallback? cancelCallback,
Function(bool)? showCallback}) async {
//调用本地:
final pref = await SharedPreferences.getInstance();
bool? isAgree = pref.getBool(SP_PRIVACY_POLICY_CHECK);
//第一次
Map<String, dynamic> param = {"id": DEBUG ? "201" : "163"};
NetUtils().req(PROTOCOL_MANAGER, param: param, isShowLoading: false,
success: (data) {
PrivacyPolicyBean bean = PrivacyPolicyBean.fromJson(data);
String? thisTime = bean.modifytime;
String? lastTime = pref.getString(SP_PRIVACY_POLICY_MODIFY_TIME);
//存储最新修改时间
pref.setString(SP_PRIVACY_POLICY_MODIFY_TIME, thisTime ?? "");
if (isAgree == null ||
!isAgree ||
thisTime == null ||
lastTime == null ||
lastTime == "" ||
(thisTime.compareTo(lastTime) > 0)) {
//弹窗
FocusScope.of(_context).requestFocus(FocusNode());
showDialog(
context: _context,
barrierDismissible: false,
useRootNavigator: false,
builder: (BuildContext context) {
return PrivacyPolicyDialog(
policyCallback: policyCallback,
confirmCallback: confirmCallback,
cancelCallback: cancelCallback,
);
});
if (showCallback != null) {
showCallback(true);
}
} else {
if (showCallback != null) {
showCallback(false);
}
}
}, error: (code, msg) {
if (isAgree == null || !isAgree) {
//异常弹窗
FocusScope.of(_context).requestFocus(FocusNode());
showDialog(
context: _context,
barrierDismissible: false,
useRootNavigator: false,
builder: (BuildContext context) {
return PrivacyPolicyDialog(
policyCallback: policyCallback,
confirmCallback: confirmCallback,
cancelCallback: cancelCallback,
);
});
if (showCallback != null) {
showCallback(true);
}
} else {
if (showCallback != null) {
showCallback(false);
}
}
});
}
}
Future.delayed(const Duration(seconds: 2), () {
DialogUtils.showPrivacyDialog(context);
});
/// 隐私框
class PrivacyPolicyDialog extends StatefulWidget {
const PrivacyPolicyDialog(
{Key? key,
this.policyCallback,
this.confirmCallback,
this.cancelCallback})
: super(key: key);
//协议回调
final Function(String)? policyCallback;
//完成流程回调
final VoidCallback? confirmCallback;
//拒绝按钮的回调
final VoidCallback? cancelCallback;
@override
State<PrivacyPolicyDialog> createState() => _PrivacyPolicyDialogState();
}
class _PrivacyPolicyDialogState extends State<PrivacyPolicyDialog> {
final FocusNode focusNodeVerifyCode = FocusNode();
TextEditingController loginVerifyCodeController = new TextEditingController();
bool isCountdown = false;
@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency,
child: Center(
child: Container(
decoration: BoxDecoration(
color: ColorConfig.COLOR_WHITE,
borderRadius: BorderRadius.all(Radius.circular(24.rpx())),
),
width: 280.rpx(),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
alignment: Alignment.center,
padding: EdgeInsets.only(top: 24.rpx(), bottom: 24.rpx()),
child: Text("个人信息保护指引",
textAlign: TextAlign.center,
style: TextStyle(
color: ColorConfig.COLOR_TEXT_3, fontSize: 18.rpx())),
),
Container(
alignment: Alignment.center,
padding: EdgeInsets.only(left: 24.rpx(), right: 24.rpx()),
child: Align(
alignment: Alignment.topCenter,
child: Row(
children: [
Text(
"欢迎使用普泽基金应用!我们将通过",
style: TextStyle(
color: ColorConfig.COLOR_TEXT_2,
fontSize: 14.rpx()),
),
],
),
)),
Container(
alignment: Alignment.topLeft,
padding: EdgeInsets.only(left: 24.rpx(), right: 24.rpx()),
child: Align(
alignment: Alignment.topLeft,
child: Row(
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
if (widget.policyCallback != null) {
widget.policyCallback!("注册服务协议");
}
RouterUtil.pushToWeb(WEB_REGISTER_URL);
},
child: Text(
"《注册服务协议》",
style: TextStyle(
fontSize: 14.rpx(),
color: ColorConfig.COLOR_MAIN),
),
),
Text(
"、",
style: TextStyle(
color: ColorConfig.COLOR_TEXT_2,
fontSize: 14.rpx()),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
if (widget.policyCallback != null) {
widget.policyCallback!("隐私政策");
}
RouterUtil.pushToWeb(WEB_PRIVACYPOLICY_URL);
},
child: Text(
"《隐私政策》",
style: TextStyle(
fontSize: 14.rpx(),
color: ColorConfig.COLOR_MAIN),
),
),
],
),
)),
Container(
alignment: Alignment.topLeft,
padding: EdgeInsets.only(
top: 1.rpx(), left: 24.rpx(), right: 24.rpx()),
child: Text(
"帮助您了解我们收集、使用、存储和共享个人信息的情况,了解您的相关权利。\n\n为了保证您更好的体验,可能需要获取通知权限、电话权限、相机权限、存储权限、设备信息。当开启权限后方可使用相关功能。\n\n请仔细阅读,如您同意,请点击下方同意按钮以接受我们的服务。",
textAlign: TextAlign.left,
style: TextStyle(
color: ColorConfig.COLOR_TEXT_2, fontSize: 14.rpx())),
),
Container(
padding: EdgeInsets.only(
top: 20.rpx(),
left: 24.rpx(),
right: 24.rpx(),
bottom: 20.rpx()),
child: UICommonButton(
height: 40.rpx(),
raduis: 25,
isCanClick: true,
text: "同意",
textColor: ColorConfig.COLOR_WHITE,
colors: [
ColorConfig.COLOR_MAIN_GRADUAL_START,
ColorConfig.COLOR_MAIN_GRADUAL_END
],
callback: _toConfirm),
),
Container(
padding: EdgeInsets.only(
left: 24.rpx(), right: 24.rpx(), bottom: 20.rpx()),
child: UICommonButton(
height: 40.rpx(),
isCanClick: true,
text: "拒绝",
textColor: ColorConfig.COLOR_MAIN,
colors: [Colors.transparent, Colors.transparent],
callback: _toCancel),
),
],
),
),
),
);
}
Future<void> _toConfirm() async {
final pref = await SharedPreferences.getInstance();
bool isCheckOk = await pref.setBool(SP_PRIVACY_POLICY_CHECK, true);
if (isCheckOk) {
if (widget.confirmCallback != null) {
widget.confirmCallback!();
}
FlutterMethodChannel().initThirdSDK();
Navigator.of(context).pop();
}
}
Future<void> _toCancel() async {
final pref = await SharedPreferences.getInstance();
bool isCheckOk = await pref.setBool(SP_PRIVACY_POLICY_CHECK, false);
if (isCheckOk) {
if (widget.cancelCallback != null) {
widget.cancelCallback!();
}
Navigator.of(context).pop();
}
}
}