Flutter验证码插件sm_captcha的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter验证码插件sm_captcha的使用

sm_captcha

sm_captcha 是一个用于在 Flutter 应用中集成滑块验证码功能的插件。通过此插件,开发者可以轻松地为应用添加防机器人验证的功能。


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 sm_captcha 插件:

dependencies:
  sm_captcha: ^最新版本号

然后运行以下命令以更新依赖:

flutter pub get

2. 初始化项目

创建一个新的 Flutter 项目,并确保已正确配置 flutter_smart_dialog 插件。flutter_smart_dialog 用于弹出验证码窗口。


3. 配置与实现

示例代码

以下是完整的示例代码,展示如何在 Flutter 中使用 sm_captcha 插件:

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:sm_captcha/sm_captcha.dart';
import 'dart:convert' as convert;

// 自定义按钮组件
import 'gradient_button.dart';

void main() {
  runApp(const MyInitApp());
}

class MyInitApp extends StatelessWidget {
  const MyInitApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const MyApp(),
      navigatorObservers: [FlutterSmartDialog.observer],
      builder: FlutterSmartDialog.init(),
    );
  }
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('滑块验证码'),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int captchaMode = 0; // 当前验证码模式

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Container(
        margin: const EdgeInsets.only(left: 16.0, right: 16.0, top: 56.0),
        child: Column(
          children: [
            // 验证码区域
            Container(
              height: 285,
              width: double.infinity,
              color: const Color(0xFF1D2933),
              child: SmCaptchaView(
                onCaptchaCreated: (controller) {
                  controller.start(); // 开始验证
                },
                onReady: () {
                  return onReady(); // 获取授权信息
                },
                onSuccess: (pass, rid) async {
                  print("---------&gt;onSuccess $pass,$rid");
                },
                onError: (code, msg) async {
                  print("---------&gt;onError $code,$msg");
                },
                onCancel: () async {
                  return null;
                },
              ),
            ),
            const SizedBox(height: 10.0),
            // 验证码模式切换
            Container(
              height: 40,
              alignment: Alignment.centerLeft,
              child: _getCaptchaMode(),
            ),
            // 弹窗验证码按钮
            Container(
              height: 40.0,
              child: Row(
                children: [
                  GradientButton(
                    beginColor: const Color(0xffff9047),
                    endColor: const Color(0xffff5722),
                    height: 40.0,
                    width: 130.0,
                    onPress: () {
                      setState(() {
                        _show(); // 显示弹窗验证码
                      });
                    },
                    isEnabled: true,
                    text: "弹窗验证码",
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  /// 获取数美图形验证码授权
  Future<String?> onReady() async {
    final completer = Completer<String>();
    SmConfig config = SmConfig(
      organization: 'RlokQwRlVjUrTUlkIqOg', // 数美的组织 ID
      appId: 'default', // 默认应用 ID
      captchaMode: captchaMode, // 当前验证码模式
    );
    String json = convert.jsonEncode(config);
    completer.complete(json);
    return completer.future;
  }

  // 获取验证码模式选项
  Widget _getCaptchaMode() {
    return ListView(
      scrollDirection: Axis.horizontal,
      children: [
        _radioWidget('滑动式', 0),
        const SizedBox(width: 20),
        _radioWidget('文字点选式', 1),
        const SizedBox(width: 20),
        _radioWidget('图标点选式', 2),
        const SizedBox(width: 20),
        _radioWidget('语序点选', 3),
        const SizedBox(width: 20),
        _radioWidget('空间逻辑推理', 4),
      ],
    );
  }

  // 单选框生成器
  Widget _radioWidget(String title, int val) {
    return SizedBox(
      height: 30.0,
      child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
        Radio(
          value: val,
          groupValue: captchaMode,
          onChanged: (value) {
            setState(() {
              captchaMode = int.parse(value.toString());
            });
          },
        ),
        Text(title, style: const TextStyle(color: Colors.black45)),
      ]),
    );
  }

  // 弹窗验证码
  void _show() {
    SmartDialog.show(
      isLoadingTemp: false,
      widget: Container(
        height: 275.0,
        width: double.infinity,
        margin: const EdgeInsets.symmetric(horizontal: 16.0),
        decoration: BoxDecoration(
          color: const Color(0xFF1D2933),
          borderRadius: BorderRadius.circular(10),
        ),
        alignment: Alignment.center,
        child: SmCaptchaView(
          onCaptchaCreated: (controller) {
            controller.start(); // 开始验证
          },
          onReady: () {
            return onReady(); // 获取授权信息
          },
          onSuccess: (pass, rid) async {
            print("---------&gt;onSuccess $pass,$rid");
            if (pass) {
              SmartDialog.dismiss(); // 验证成功后关闭弹窗
            }
          },
          onError: (code, msg) async {
            print("---------&gt;onError $code,$msg");
          },
          onCancel: () async {
            SmartDialog.dismiss(); // 用户取消验证时关闭弹窗
          },
        ),
      ),
    );
  }
}

更多关于Flutter验证码插件sm_captcha的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter验证码插件sm_captcha的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sm_captcha 是一个用于 Flutter 的验证码插件,通常用于生成和验证图形验证码。以下是如何在 Flutter 项目中使用 sm_captcha 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sm_captcha 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sm_captcha: ^1.0.0  # 请根据实际版本号进行替换

然后运行 flutter pub get 来获取依赖。

2. 导入包

在需要使用验证码的 Dart 文件中导入 sm_captcha 包:

import 'package:sm_captcha/sm_captcha.dart';

3. 使用 SmCaptcha 组件

你可以在 Flutter 的 Widget 中使用 SmCaptcha 组件来显示验证码。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CaptchaDemo(),
    );
  }
}

class CaptchaDemo extends StatefulWidget {
  @override
  _CaptchaDemoState createState() => _CaptchaDemoState();
}

class _CaptchaDemoState extends State<CaptchaDemo> {
  String _captchaText = '';

  void _onCaptchaGenerated(String captchaText) {
    setState(() {
      _captchaText = captchaText;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SM Captcha Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SmCaptcha(
              onCaptchaGenerated: _onCaptchaGenerated,
              width: 150,
              height: 50,
              backgroundColor: Colors.white,
              textColor: Colors.black,
              noiseColor: Colors.grey,
              length: 4, // 验证码长度
              fontSize: 30,
              hasBorder: true,
              borderColor: Colors.black,
              borderWidth: 1,
            ),
            SizedBox(height: 20),
            Text('验证码: $_captchaText'),
          ],
        ),
      ),
    );
  }
}

4. 自定义验证码样式

SmCaptcha 组件提供了多个参数来自定义验证码的样式和行为,例如:

  • widthheight: 验证码的宽度和高度。
  • backgroundColor: 验证码的背景颜色。
  • textColor: 验证码文本的颜色。
  • noiseColor: 验证码噪声线的颜色。
  • length: 验证码的长度。
  • fontSize: 验证码文本的字体大小。
  • hasBorder: 是否显示边框。
  • borderColor: 边框的颜色。
  • borderWidth: 边框的宽度。

5. 验证用户输入

当用户输入验证码后,你可以将用户输入的验证码与 _captchaText 进行比较,以验证用户输入是否正确。

bool verifyCaptcha(String userInput) {
  return userInput == _captchaText;
}

6. 重新生成验证码

如果需要重新生成验证码,可以调用 SmCaptcha 组件的 refreshCaptcha 方法。

final GlobalKey<SmCaptchaState> _captchaKey = GlobalKey();

void _refreshCaptcha() {
  _captchaKey.currentState?.refreshCaptcha();
}

// 在 SmCaptcha 组件中添加 key
SmCaptcha(
  key: _captchaKey,
  onCaptchaGenerated: _onCaptchaGenerated,
  // 其他参数...
);

7. 处理验证码生成事件

onCaptchaGenerated 回调函数会在验证码生成时被调用,你可以在该回调中获取生成的验证码文本。

void _onCaptchaGenerated(String captchaText) {
  setState(() {
    _captchaText = captchaText;
  });
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!