Flutter相关

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();
    }
  }
}

上一篇下一篇

猜你喜欢

热点阅读