secverify 1.0.2

  • Readme
  • Changelog
  • Example
  • Installing
  • new49

SecVerify For Flutter #

运营商网关取号,一秒验证手机号 #

支持的原生SDK版本

简介: http://www.mob.com/product/secverify

插件主页: https://pub.dartlang.org/packages/secverify_plugin

官网文档: https://www.mob.com/wiki/detailed?wiki=miaoyan_chanpinjianjie&id=78

1.Flutter集成文档 SecVerify-For-Flutter 在线文档 2.iOS平台配置参考 iOS集成文档

  • 实现 "一、注册应用获取appKey 和 appSecret"
  • 实现 "三、配置appkey和appSecret"

3.Android平台集成

#####导入SMSSDK相关依赖

  1. 在项目根目录的build.gradle中添加以下代码:
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'com.mob.sdk:MobSDK:+'
    }
  1. 在/android/app/build.gradle中添加以下代码:
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// 导入MobSDK
apply plugin: 'com.mob.sdk'
MobSDK {
   appKey "替换为mob官方申请的appkey"
   appSecret "替换为mob官方申请的appkey对应的appSecret"
   SecVerify {}
}
  1. 在根路径下的pubspec.yaml文件中添加smssdk flutter插件:
dependencies:
  secverify:^1.0.2

在你项目的Dart中添加以下代码:

 import 'package:secverify/secverify.dart'

这样,就可以使用plugin中定义的dart api了。

  1. 平台相关集成 在项目的/android/app/build.gradle中添加:
android {
    // lines skipped
    dependencies {
        provided rootProject.findProject(":secverify")
    }
}

这样就可以在你的project/android/src下的类中import cn.mob.secverifyplugin并使用SecverifyPlugin中的api了。

######添加代码

  1. 在MainActivity的onCreate中添加以下代码:
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
    // 注册SecVerify Flutter插件
    SecverifyPlugin.registerWith(registrarFor(SecverifyPlugin.CHANNEL));
    // 初始化SecVerify
    MobSDK.init(this, MOB_APPKEY, MOB_APPSECRET);
  }

技术支持 #

如有问题请联系技术支持:

服务电话:   400-685-2216
QQ:        4006852216
节假日值班电话:
    iOS:185-1664-1951
Android: 185-1664-1950
电子邮箱:   support@mob.com
市场合作:   021-54623100

1.0.0 #

  • add all functions of onekeylogin

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:convert';

import 'package:flutter/services.dart';
import 'package:secverify/secverify.dart';
import 'package:http/http.dart' as http;

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _version = "unkown";
  bool _isVerifySupport = true;
  @override
  void initState() {
    super.initState();
    //可选预先设置
    preSettings();
    //判断手机本地环境是否支持
    isVerifySupport();
    if (_isVerifySupport) {
      //预取号
      preVerify();
    }
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstView(_version),

    );
  }

  void preVerify(){
    Secverify.preVerify((Map ret, Map err){
      if(err!=null)
      {
        //失败情况下会返回错误信息,可以打印查看
//        showAlert(err.toString(),context);
      }
      else
      {
        String rst = ret.toString();
        if (ret == null || ret.isEmpty) {
          rst = '预登录成功!';
          print(rst);
        }
//        showAlert(rst,context);
      }
    });
  }

  void preSettings() {
    //提交隐私协议结果
    Secverify.submitPrivacyGrantResult(true);
    //是否自动关闭授权页面,如果不自动关闭,必须在取号回调中调用方法关闭授权页面
    Secverify.autoFinishOauthPage(false);
    //是否输出运营商控制台日志
    Secverify.setDebugMode(false);
    //设置超时时间
    Secverify.setTimeOut(5000);
    //获取当前SDK版本号
    getVersion();
  }

  Future<void> getVersion() async {
    String version;
    version = await Secverify.getVersion;
    setState(() {
      _version = version;
    });

  }

  Future<void> isVerifySupport() async {
    bool isVerifySupport = await Secverify.isVerifySupport;
    setState(() {
      this._isVerifySupport = isVerifySupport;
    });

  }


}

class FirstView extends StatelessWidget{
  String _version;

  FirstView(this._version);

  @override
  Widget build(BuildContext context) {
    return
      Scaffold(
        appBar: AppBar(title: Text('SecVerify Flutter'),),
        body: Center(
          child: Column(
            children: <Widget>[
              Container(
                child: RaisedButton(
                  child: Text("默认样式"),
                  onPressed: (){
                    Secverify.isVerifySupport.then((bool value)  {
                      if(value) {
                        // 清空样式设置
                        Secverify.setPortraitLayout(null);
                        verify(context);
                      } else {
                        showAlert("当前环境不支持", context);
                      }
                    });
                  },
                ),
              ),
              Container(
                child: RaisedButton(
                  child: Text("自定义样式"),
                  onPressed: (){
//                    isVerifySupport();
                    // 取号前设置
                    preSettings();
                    //设置UI属性
                    setPortraitLayout();
                    Secverify.isVerifySupport.then((bool value)  {
                      if(value) {
                        verify(context);
                      } else {
                        showAlert("当前环境不支持", context);
                      }
                    });
                  },
                ),
              ),
              Text(
                "当前版本号: " + _version
              ),
            ],
          ),
        ),
      );
  }

  void preVerify(BuildContext context){
    Secverify.preVerify((Map ret, Map err){
      if(err!=null)
      {
        showAlert(err.toString(),context);
      }
      else
      {
        String rst = ret.toString();
        if (ret == null || ret.isEmpty) {
          rst = '预登录成功!';
        }
        showAlert(rst,context);
      }
    });
  }

  //取号接口
  void verify(BuildContext context) {
    Secverify.preVerify((ret, err){
      if(err!=null)
      {
        showAlert(err.toString(),context);
      }
      else
      {
        Secverify.verify((Map ret, Map err) {
          if (err != null) {
            //打印错误信息
            showAlert(err.toString(), context);
          }
          else {
            String rst = ret.toString();
            if (ret == null || ret.isEmpty) {
              rst = '登录失败';
              showAlert(rst, context);
            } else if(ret.containsKey("opToken")){
              //如果登录成功,将返回的信息提交给自己的服务器
              doLogin(ret, context);
            }
          }
          //调用此方法手动关闭授权页面
          Secverify.finshOauthPage();
        });
      }
    });
    
  }

  //需要自己实现这部分
  void doLogin(Map ret, BuildContext context) async {
    var optoken = ret.containsKey("opToken") ? ret["opToken"] : "";
    var token = ret.containsKey("token") ? ret["token"] : "";
    var operator = ret.containsKey("operator") ? ret["operator"] : "";
    var phoneOperator = ret.containsKey("phoneOperator") ? ret["phoneOperator"] : "";
    var md5 = ret.containsKey("md5") ? ret["md5"] : "";
    var appkey = ret.containsKey("appkey") ? ret["appkey"] : "";

    var params = Map<String, String>();
    params["opToken"] = optoken;
    params["operator"] = operator;
    params["phoneOperator"] = phoneOperator;
    params["token"] = token;
    params["md5"] = md5;
    params["appkey"] = appkey;

    var header = Map<String, String>();
    header["Content-Type"] = "application/json";

    var client = http.Client();
    //提交的地址需要为实现了秒验服务端接口的服务器地址
    var response = await client.post("http://demo.verify.mob.com/demo/sdkLogin", headers: header, body: json.encode(params));
    var _content = response.body;
    print(_content.toString());
    showAlert(_content.toString(), context);
  }

//  Future<void> isVerifySupport() async {
//    bool isVerifySupport = await Secverify.isVerifySupport;
//    this._isVerifySupport = isVerifySupport;
//  }

  Future<bool>  get isVerifySupport async {
    bool isVerifySupport = await Secverify.isVerifySupport;
    return isVerifySupport;
//    this._isVerifySupport = isVerifySupport;
  }

  void showAlert(String text, BuildContext context) {
    showDialog(
        context: context,
        builder: (BuildContext context) => AlertDialog(
            title: new Text("提示"),
            content: new Text(text),
            actions: <Widget>[
              new FlatButton(
                child: new Text("OK"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ]));
  }

  //设置授权页面属性
  void setPortraitLayout() {
    if (Platform.isAndroid) {
      // 以下是 Android 自定义设置
      // 导航栏设置
      var customNav= {
        "navColor": "#F0C3D6",  //导航栏背景颜色
        "navText": "一键登录",   //导航栏文本内容
        "navTextColor": "#ffffff", //导航栏文本颜色
        "navHidden": false, //导航栏是否隐藏
        "navTransparent": false,//导航栏是否透明
        "navCloseImgHidden": false,//导航栏返回图片是否隐藏
        "navTextSize": 16,//导航栏文本大小
        "navTextBold": false,//导航栏文本是否加粗
        "navCloseImgPath": "close.png", //导航栏返回图片地址
        "portraitLayout": {
          "layoutWidth": 50,//导航栏图片宽度
          "layoutHeight": 50,//导航栏图片高度
          "layoutLeft": 10,//导航栏图片左间距
//          "layoutRight": 30,//导航栏图片右间距
//          "layoutTop": 10,//导航栏图片顶部间距
        }
      };
      // 授权页
      var customAuthPage= {
//        "backgroundImg":"bg.png",//授权页面背景图片地址
        "backgroundClickClose": false,//授权页面点击关闭
        "fullScreen": false,//是否全屏
        "immersiveTheme": true, // 是否沉浸式透明状态栏
        "immersiveStatusTextColorBlack": true // 是否修改状态栏意思
      };
      // 授权页Logo
      var customAuthPageLogo= {
        "logoImg": "app_icon.png",//logo地址
        "logoAlignParentRight": false,//logo是否靠页面右侧
        "logoHidden": false,// logo是否隐藏
        "portraitLayout": {
          "layoutWidth": 80,//logo宽度
          "layoutHeight": 80,//logo高度
//          "layoutLeft": 30,//logo左间距
//          "layoutRight": 30,//logo右间距
          "layoutTop": 30,//logo顶部间距
//          "layoutBottom": 30,//logo底部间距
        }
      };

      // 手机号码
      var customPhoneNumber= {
        "numberColor":"#FFCC00",// 脱敏手机号颜色
        "numberSize":20,//脱敏手机号大小
        "numberAlignParentRight":false,//脱敏手机号是否靠页面右侧
        "numberHidden":false,//脱敏手机号是否隐藏
        "numberBold":false,//脱敏手机号字体是否加粗
        "portraitLayout": {
//          "layoutLeft": 30,//脱敏手机号左间距
//          "layoutRight": 30,//脱敏手机号右间距
          "layoutTop": 130,//脱敏手机号顶部间距
//          "layoutBottom": 30,//脱敏手机号底部间距
        }
      };

      // 切换帐号按钮
      var customSwitchNumber= {
        "switchAccColor": '#FFCC00',//切换登录文本颜色
        "switchAccTextSize": 16,//切换登录文字大小
        "switchAccHidden": false,//切换登录是否隐藏
        "switchAccAlignParentRight": false,//切换登录是否靠屏幕右侧
        "switchAccText": '选择其他方式登录',//切换登录文本内容
        "switchAccTextBold": false,//切换登录文本是否加粗
        "portraitLayout": {
//          "layoutLeft": 30,//切换登录左间距
//          "layoutRight": 30,//切换登录右间距
          "layoutTop": 170,//切换登录顶部间距
//          "layoutBottom": 30,//切换登录底部间距
        }
      };

      // 登陆按钮设置
      var customLoginBtn= {
        "loginBtnImgArr": ["ffffff","000000"],//登录按钮背景图片或者颜色
        "loginBtnText": "登录",//登录按钮文本
        "loginBtnTextColor": "#F1C4A8",//登录按钮文字颜色
        "loginBtnTextSize": 16,//登录按钮文本大小
        "loginBtnAlignParentRight": false,//登录按钮是否靠屏幕右侧
        "loginBtnHidden": false,//登录按钮是否隐藏
        "loginBtnTextBold": false,//登录按钮文本是否加粗
        "portraitLayout": {
          "layoutWidth": 200,//登录按钮宽度
          "layoutHeight": 45,//登录按钮高度
//          "layoutLeft": 30,//登录按钮左间距
//          "layoutRight": 30,//登录按钮右间距
          "layoutTop": 200,//登录按钮顶部间距
//          "layoutBottom": 30,//登录按钮底部间距
        }
      };

      // 隐私条款设置(切记,不可隐藏)
      var customPrivacy= {
        "agreementColor": "#00FFDD",//运营商隐私条款颜色和自定义隐私条款文本颜色
        "agreementBaseTextColor": "#330F33",//隐私条款其他文字颜色
        "agreementTextSize": 16,//隐私条款文字大小
        "agreementTextStart": "登录即同意",//隐私条款开头文本
        "agreementTextEnd": "并授权获取本机号码",//隐私条款结束文本
        "agreementAlignParentRight": false,//隐私条款是否靠屏幕右侧
        "agreementHidden": false,//隐私条款是否隐藏
        "agreementCmccText": "《中国移动服务协议》",//隐私条款 移动运营商显示文本
        "agreementCuccText": "《中国联通服务协议》",//隐私条款 联通运营商显示文本
        "agreementCtccText": "《中国电信服务协议》",//隐私条款 电信运营商显示文本
        "agreementTextBold": false,//隐私条款文本是否加粗
        "agreementTextWithUnderLine": false,//隐私条款是否带下划线
        "cusAgreementFirstArray": ['服务协议',
          'https://gitee.com/',
          '、'],//隐私条款 自定义一
        "cusAgreementSecondArray": ['百度协议',
          'https://www.baidu.com',
          '和'],//隐私条款 自定义二
        "cusAgreementThirdArray": ['隐私条款',
          'https://gitee.com/',
          '、'],//隐私条款 自定义三
        "agreementUncheckHintText": "请阅读并勾选隐私协议",//隐私条款 未勾选时提示的文本
        "portraitLayout": {
          "layoutLeft": 20,//隐私条款左间距
          "layoutRight": 20,//隐私条款右间距
          "layoutTop": 270,//隐私条款顶部间距
//          "layoutBottom": 20,//隐私条款底部间距
        }
      };

      // 隐私条款复选框
      var customCheckBox= {
        "checkboxImg":["checked.png","uncheck.png"],    // 隐私协议checkbox背景图片
        "checkboxDefaultState":true,    // 隐私协议checkbox默认状态
        "checkboxHidden":false,//隐私协议checkbox是否隐藏
        "scale": 1.5,
        "portraitLayout": {
          "layoutWidth": 50,//隐私协议checkbox 返回图标宽度
          "layoutHeight": 50,//隐私协议checkbox 返回图标高度
//          "layoutLeft": 20,//隐私协议checkbox左间距
//          "layoutRight": 20,//隐私协议checkbox右间距
//          "layoutTop": 10,//隐私协议checkbox顶部间距
//          "layoutBottom": 20,//隐私协议checkbox底部间距
        }

      }
      ;
      // 隐私条款具体协议内容页面设置
      var customPrivacyContentPage= {
        "agreementPageTitle": "隐私协议页",//隐私协议页面 标题
        "cusAgreementPageOneTitle": "自定义隐私协议页一",//隐私协议页面 自定义隐私协议一标题
        "cusAgreementPageTwoTitle": "自定义隐私协议页二",//隐私协议页面 自定义隐私协议二标题
        "cusAgreementPageThreeTitle": "自定义隐私协议页三",//隐私协议页面 自定义隐私协议三标题
        "agreementPageCloseImg": "close.png",//隐私协议页面 返回图标名称
        "agreementPageTitleTextSize": 16,//隐私协议页面 标题文本大小
        "agreementPageTitleTextColor": "#330F33",//隐私协议页面  标题文本颜色
        "agreementPageTitleTextBold": true,//隐私协议页面 标题文本是否加粗
        "agreementPageTitleHidden": false,//隐私协议页面 标题文本是否隐藏
        "agreementPageCloseImgHidden": false,//隐私协议页面 返回图标是否隐藏
        "portraitLayout": {
          "layoutWidth": 50,//隐私协议页面 返回图标宽度
          "layoutHeight": 50,//隐私协议页面 返回图标高度
        }
      };

      // 运营商品牌标签
      var customOperatorSlogan= {
        "sloganTextSize": 20,// Slogan文本大小
        "sloganTextColor": "#330F33",// Slogan文本颜色
        "sloganHidden": false,// Slogan是否隐藏
        "sloganAlignParentRight": false,// Slogan是否靠屏幕右侧
        "sloganTextBold": true,// Slogan文本是否加粗
        "portraitLayout": {
//          "layoutLeft": 30,//Slogan左间距
//          "layoutRight": 30,//Slogan右间距
//          "layoutTop": 30,//Slogan顶部间距
          "layoutBottom": 30,//Slogan底部间距
        }
      };

      // 弹窗设置
      var customDialog= {
        "dialogTheme": false,//弹框
        "dialogAlignBottom": false,//弹框是否靠底部
//        "dialogBackground": "bg.png",//弹框蒙版背景图片名称
        "dialogBackgroundClickClose": false,//弹框蒙版背景是否点击关闭
        "portraitLayout": {
          "layoutWidth": 250,//弹框宽度
          "layoutHeight": 400,//弹框高度
          "layoutLeft": 30,//弹框左间距
          "layoutTop": 30,//弹框顶部间距
        }

      }
      ;
      // 自定义控件设置,目前安卓只支持文本TextView和图片ImageView
      var customView= {
        "customView": [ {
          "viewClass": "TextView",//添加的控件类型
          "viewText": "测试文本1",// 控件文本
          "viewTextColor": "#330F33",// 控件文本颜色
          "viewTextFont": 20,// 控件文本大小
          "viewTextBold": true,// 控件文本是否加粗
          "viewAlignParentRight":false,// 控件是否靠屏幕右侧
          "viewHorizontalCenter":true,//控件是否靠屏幕中间
          "portraitLayout": {
//            "layoutLeft": 30,//控件左间距
//            "layoutRight": 30,//控件右间距
//            "layoutTop": 30,//控件顶部间距
            "layoutBottom": 135,//控件底部间距
          }
        },
          {
            "viewClass": "TextView",//添加的控件类型
            "viewText": "测试文本2",// 控件文本
            "viewTextColor": "#330F33",// 控件文本颜色
            "viewTextFont": 16,// 控件文本大小
            "viewTextBold": false,// 控件文本是否加粗
            "viewAlignParentRight":false,//控件是否靠屏幕右侧
            "viewHorizontalCenter":true,//控件是否靠屏幕中间
            "portraitLayout": {
//              "layoutLeft": 30,//控件左间距
//              "layoutRight": 30,//控件右间距
//              "layoutTop": 50,//控件顶部间距
              "layoutBottom": 115,//控件底部间距
            },
          },
          {
            "viewClass": "ImageView",//添加的控件类型
            "viewImg": "logo.png",//图片的地址
            "viewAlignParentRight":false,//控件是否靠屏幕右侧
            "viewHorizontalCenter":true,//控件是否靠屏幕中间
            "portraitLayout": {
              "layoutWidth": 30,//隐私协议页面 返回图标宽度
              "layoutHeight": 30,//隐私协议页面 返回图标高度
//              "layoutLeft": 30,//控件左间距
//              "layoutRight": 30,//控件右间距
//              "layoutTop": 50,//控件顶部间距
              "layoutBottom": 75,//控件底部间距
            },
          }
        ]
      };
      var customParams = {
        'customNav': customNav,//导航栏设置
        'customAuthPage': customAuthPage,//授权页面设置
        'customAuthPageLogo': customAuthPageLogo,//logo设置
        'customPhoneNumber': customPhoneNumber,//脱敏手机号设置
        'customSwitchNumber': customSwitchNumber,//切换登录设置
        'customCheckBox': customCheckBox,//复选框设置
        'customPrivacy': customPrivacy,//隐私条款设置
        'customPrivacyContentPage': customPrivacyContentPage,//隐私协议页面设置
        'customLoginBtn': customLoginBtn,//登录按钮设置
        'customOperatorSlogan': customOperatorSlogan,//slogan设置
        'customDialog': customDialog,//弹框设置
        'customView': customView,//自定义控件设置
      };
      Secverify.setPortraitLayout(customParams);
      Secverify.setLandscapeLayout(customParams);
    } else if (Platform.isIOS) {
      // 以下是 iOS 自定义设置
					// 自定义动画设置
					var customAnimation = {
						'secAnimateType': 1, //动画类型 0:默认 1:水平翻转 2:淡入淡出 3: Alert 4: Push 5:sheet
						// 'secShowType': 0, //展示类型 0:默认 1:Alert 2:Push 3: Sheet
						// 以下自定义动画设置只针对于Alert/Sheet展示类型
						'secAnimateBgColor': '#F7B376', //弹窗控制器的背景色
						'secLeftControlImage': 'leftImg.png', //左边按钮背景图片名称
						'secLeftControlHidden': true, //左边按钮是否显示
						'secRightControlImage': 'rightImg.png', //右边按钮背景图片名称
						'secRightControlHidden': true, //右边按钮是否显示
						'secBgViewHidden': false, //背景视图是否展示
						'secBgViewCorner': 15, //背景视图的圆角
						'secBgViewColor': '#000000', //背景视图颜色
						'secBgViewImage': 'bgImg.png', //背景视图的背景图片名称
						'secCloseType': true, //关闭按钮显示在左边还是右边 true:左边 false:右边
					};
					// 导航栏设置
					var customNav = {
						'secNavBarTintColor': '#F0C3D6', //  导航栏背景色(default is white)
						'secNavText': '一键验证', // 导航栏标题
						// 'secNavReturnImg': 'close.png', // 导航栏返回按钮图标
						// 'secNavBottomLineHidden': true, // 是否隐藏导航栏尾部线条(默认显示,例: true)
						// 'secNavBarHidden': false, // 导航栏隐藏(例: false)
						// 'secNavStatusBarHidden': false, // 导航栏状态栏隐藏(例: false)
						// 'secNavTranslucent': false, // 导航栏透明(例: false)
						// 'secNavBackBtnHidden': false, // 导航栏返回按钮隐藏(例: false)
						// 'secNavLeftControlHidden': false, // 隐藏导航栏左边按钮
						'secNavTintColor': '#FF0000', //  导航栏文字颜色
						// 'secNavBackgroundClear': false, //  导航栏背景透明(例: false)
					};
					// 授权页
					var customAuthPage = {
						// 'secBackgroundColor': '#E5E589', // 授权页背景颜色
						'secBgImg': 'bg.png', // 授权背景图片
						'secCancelBySingleClick': false, //单击页面实现取消操作(例: false)
					};
					// 授权页Logo
					var customAuthPageLogo = {
						'secLogoImg': 'app_icon.png', // Logo图片名称
						'secLogoHidden': false, // Logo是否隐藏(例: false)
						'secLogoCornerRadius': 10, // Logos圆角(例: 10)
						'secPortraitLayout': {
							// 针对该控件的竖屏布局(注意: 每个控件的布局字段所表示的含义都相同,下面将不再解释)
							'secLayoutTop': 100, // 顶部间距
							// 'secLayoutBottom': -40,    // 底部间距
							'secLayoutLeft': 20, // 左边间距
							// 'secLayoutRight': -20,     // 右边间距
							'secLayoutWidth': 80, // 控件宽度
							'secLayoutHeight': 80, // 控件高度
							// 'secLayoutCenterX': 0,     // 相对于父视图的CenterX的偏移量,0表示不偏移,即水平居中
							// 'secLayoutCenterY': 0,     // 相对于父视图的CenterY的偏移量,0表示不偏移,即垂直居中
						},
					};
					// 手机号码
					var customPhoneNumber = {
						'secNumberColor': '#FFCC00', // 手机号码字体颜色
						'secNumberFont': 18, // 字体大小(例: 18)
						'secNumberTextAlignment': 1, // 手机号对其方式(例: 0-Left, 1-Center, 2-Right)
						'secNumberBgColor': '#C2F6A3', // 手机号码背景颜色
						'secPhoneHidden': false, //手机号码是否隐藏
						'secPhoneBorderColor': '#FF0000', //手机号码边框颜色
						'secPhoneBorderWidth': 2, //手机号码边框宽度
						'secPhoneCorner': 5, //手机号码圆角
						'secPortraitLayout': {
							'secLayoutTop': 100 + 10,
							'secLayoutLeft': 20 + 80 + 15,
							'secLayoutRight': -20,
							'secLayoutHeight': 22, // 控件高度
						}
					};
					// 切换帐号按钮
					var customSwitchNumber = {
						'secSwitchBgColor': '#F1DBC9', // 切换账号背景颜色
						'secSwitchColor': '#FF0000', // 切换账号字体颜色
						'secSwitchFont': 14, // 切换账号字体大小
						'secSwitchTextHorizontalAlignment': 0, // 切换账号对其方式(例: 0-Center, 1-Left, 2-Right)
						'secSwitchHidden': false, // 隐藏切换账号按钮, 默认为false(例: true)
						'secSwitchText': '切换手机号', // 切换账号标题
						'secPortraitLayout': {
							'secLayoutTop': 100 + 80 - 30,
							'secLayoutLeft': 20 + 80 + 15,
							'secLayoutRight': -20,
							'secLayoutHeight': 18, // 控件高度
						}
					};
					// 登陆按钮设置
					var customLoginBtn = {
						'secLoginBtnText': '登陆', // 登录按钮文本
						'secLoginBtnTextColor': '#F1C4A8', // 登录按钮文本颜色
						'secLoginBtnBgColor': '#C3D6F1', // 登录按钮背景颜色
						'secLoginBtnBorderWidth': 2.0, // 登录按钮边框宽度 (例: 2.0)
						'secLoginBtnBorderColor': '#FFCC00', // 登录按钮边框颜色
						'secLoginBtnCornerRadius': 5.0, // 登录按钮圆角(例: 5.0)
						'secLoginBtnTextFont': 20, // 登录按钮文字字体大小
						'secLoginBtnBgImgArr': [
							'#FF0000',
							'#00FF00',
							'0000FF'
						], //['enabled.png', 'disabled.png', 'highlighted.png'], // 登录按钮背景图片数组(例:['激活状态图片','失效状态图片','高亮状态图片'], 支持颜色数组: ['#FF0000', '#00FF00', '0000FF'])
						'secLoginBtnHidden': false, // 登陆按钮是否隐藏, 不建议隐藏!!!
						'secPortraitLayout': {
							'secLayoutCenterY': 0,
							'secLayoutLeft': 20,
							'secLayoutRight': -20,
							'secLayoutHeight': 30, // 控件高度
						}
					};
					// 隐私条款设置(切记,不可隐藏)
					var customPrivacy = {
						'secPrivacyTextColor': '#00FFDD', // 隐私条款基本文字颜色
						'secPrivacyTextFont': 16, // 隐私条款协议文字字体大小
						'secPrivacyTextAlignment': 0, // 隐私条款对其方式(例: 0-Left, 1-Center, 2-Right)
						'secPrivacyAgreementColor': '#DDAA00', // 隐私条款协议文字颜色
						'secPrivacyAgreementBgColor': '#000000', // 隐私条款协议背景颜色
						'secPrivacyAppName': '秒验Flutter', // 隐私条款应用名称
						'secPrivacyProtocolMarkArr': ['《','》'], // 协议文本前后符号(例['<','>'])
						'secPrivacyFirstTextArr': ['服务协议',
							'https://gitee.com/',
							'、'
						], // 开发者隐私条款第一组协议(例:['名字','url','分割符'])
						'secPrivacySecondTextArr': ['百度协议',
							'https://www.baidu.com',
							'、'
						], // 开发者隐私条款第二组协议(例:['名字','url','分割符'])
						'secPrivacyLineSpacing': 5.0, // 隐私条款多行时行距(例: 5.0)
						// 'secPrivacyDefaultText': '开发者隐私条款', //开发者隐私条款协议默认名称(不建议修改)
						'secPrivacyUnderlineStyle': 1, //隐私协议下划线样式(例: 0-None, 1-Single, 2-Thick, 9-Double)
						'secPrivacyNormalTextFirst': '登录即同意', // 隐私条款开头(例: '登录即同意')
						'secPrivacyNormalTextEnd': '并授权秒验FlutterApp获取本机号码', // 隐私条款中间连接文字(例: '并授权')
						'secPrivacyHidden': false, // 隐私条款是否隐藏, 强烈建议不要隐藏!!!
						'isPrivacyOperatorsLast': false, // 运营商协议是否排在最后 默认为false(例: true)
						'secPortraitLayout': {
							'secLayoutLeft': 50,
							'secLayoutCenterY': 80,
							'secLayoutRight': -20,
							'secLayoutHeight': 70, // 控件高度
						}
					};
					// 隐私条款复选框
					var customCheckBox = {
						'secCheckedImg': 'checked.png', // 复选框选中时的图片
						'secUncheckedImg': 'uncheck.png', // 复选框未选中时的图片
						'secCheckDefaultState': false, // 隐私条款check框默认状态,默认为false(例: true)
						// secCheckSize: 30, // 复选框尺寸(宽高相同,例: 30)
						'secCheckHidden': false, // 隐私条款check框是否隐藏,默认为false(例: true)
						'secPortraitLayout': {
							// !!!! 注意: 这个复选框的布局是相对于隐私条款的,所以建议先把隐私条款布局好再布局这个框
							'secLayoutRight': -10,
							'secLayoutCenterY': -20,
							'secLayoutWidth': 20,
							'secLayoutHeight': 20,
						}
					};
					// 隐私条款具体协议内容页面设置
					var customPrivacyContentPage = {
						'secPrivacyWebBackBtnImage': 'close.png', // 隐私条款WEB页面返回按钮图片
						'secPrivacyWebTitle': '隐私条款内容', // 隐私条款WEB页面标题
						'secPrivacyWebNavBarStyle': 0, // 隐私条款导航style (例: 0-Default, 1-Black)
					};
					// 运营商品牌标签
					var customOperatorSlogan = {
						'secSloganTextFont': 13, //运营商品牌文字字体大小
						'secSloganTextColor': '#0099FF', //运营商品牌文字颜色
						'secSloganTextAlignment': 1, //运营商品牌文字对齐方式(例: 0-Left, 1-Center, 2-Right)
						'secSloganBgColor': '#666666', //运营商品牌背景颜色
						// 'secSloganText': '运营商品牌文字', //运营商品牌文字(不建议修改)
						'secSloganHidden': false, //运营商品牌是否隐藏
						'secSloganBorderColor': '#FFEEDD', //运营商品牌边框颜色
						'secSloganBorderWidth': 2.0, //运营商品牌边框宽度
						'secSloganCorner': 5.0, //运营商品牌边框圆角
						'secPortraitLayout': {
							'secLayoutLeft': 20,
							'secLayoutRight': -20,
							'secLayoutBottom': -64,
							'secLayoutHeight': 18, // 控件高度
						},
					};
					var customParams = {
						'customAnimation': customAnimation,
						'customNav': customNav,
						'customAuthPage': customAuthPage,
						'customAuthPageLogo': customAuthPageLogo,
						'customPhoneNumber': customPhoneNumber,
						'customSwitchNumber': customSwitchNumber,
						'customCheckBox': customCheckBox,
						'customPrivacy': customPrivacy,
						'customPrivacyContentPage': customPrivacyContentPage,
						'customLoginBtn': customLoginBtn,
						'customOperatorSlogan': customOperatorSlogan,
					};
          Secverify.setPortraitLayout(customParams);
          // Secverify.setLandscapeLayout(customParams);
    }

  }

  void preSettings() {
    Secverify.autoFinishOauthPage(false);
  }
}

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  secverify: ^1.0.2

2. Install it

You can install packages from the command line:

with Flutter:


$ flutter pub get

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:secverify/secverify.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
0
Health:
Code health derived from static analysis. [more]
96
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
100
Overall:
Weighted score of the above. [more]
49
Learn more about scoring.

We analyzed this package on Jul 3, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.8.4
  • pana: 0.13.13
  • Flutter: 1.17.5

Analysis suggestions

Package does not support Flutter platform linux

Because of import path [package:secverify/secverify.dart] that declares support for platforms: android, ios

Package does not support Flutter platform macos

Because of import path [package:secverify/secverify.dart] that declares support for platforms: android, ios

Package does not support Flutter platform web

Because of import path [package:secverify/secverify.dart] that declares support for platforms: android, ios

Package does not support Flutter platform windows

Because of import path [package:secverify/secverify.dart] that declares support for platforms: android, ios

Package not compatible with SDK dart

because of import path [secverify] that is in a package requiring null.

Health issues and suggestions

Document public APIs. (-1 points)

15 out of 15 API elements have no dartdoc comment.Providing good documentation for libraries, classes, functions, and other API elements improves code readability and helps developers find and use your API.

Fix lib/secverify.dart. (-2.96 points)

Analysis of lib/secverify.dart reported 6 hints, including:

line 42 col 17: This function has a return type of 'Future

line 52 col 17: This function has a return type of 'Future

line 57 col 17: This function has a return type of 'Future

line 61 col 17: This function has a return type of 'Future

line 66 col 17: This function has a return type of 'Future

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.1.0 <3.0.0
flutter 0.0.0
Transitive dependencies
collection 1.14.12 1.14.13
meta 1.1.8
sky_engine 0.0.99
typed_data 1.1.6 1.2.0
vector_math 2.0.8
Dev dependencies
flutter_test