Flutter插件botion_flutter_plugin的安装与使用方法

Flutter插件botion_flutter_plugin的安装与使用方法

概述

botion_flutter_plugin 是一个官方提供的 Flutter 插件项目,用于支持 Botion 自适应验证码(Adaptive CAPTCHA)。该插件兼容 Flutter 2.0。


安装

使用 GitHub 集成

在项目的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  botion_flutter_plugin:
    git:
      url: https://github.com/BotionTeam/botion_flutter_plugin.git
      ref: main
使用 Pub 集成

也可以通过 Pub 包管理器安装:

dependencies:
  botion_flutter_plugin: ^0.0.2

完成后,运行 flutter pub get 更新依赖。


配置

在使用插件之前,需要在 Botion 仪表盘 创建您的 ID 和密钥,并部署相应的后端 API。详细步骤可参考 Botion 文档


示例代码

以下是一个完整的示例,展示如何初始化、验证和处理事件。

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

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:botion_flutter_plugin/boc_flutter_plugin.dart';
import 'package:botion_flutter_plugin/boc_session_configuration.dart';
import 'package:http/http.dart' as http;

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  /// 监听页面配置变化
  static const MethodChannel _demoChannel = MethodChannel('boc_flutter_demo');

  /// 初始化前,请将 `captchaId` 替换为您从账户后台注册的验证码 ID。
  late final BocFlutterPlugin captcha;

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步初始化平台状态
  Future<void> initPlatformState() async {
    BOCSessionConfiguration config = BOCSessionConfiguration();
    config.logEnable = false;
    captcha = BocFlutterPlugin("123456789012345678901234567890ab", config);

    String platformVersion;
    try {
      platformVersion = await BocFlutterPlugin.platformVersion ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    try {
      _demoChannel.setMethodCallHandler(_configurationChanged);

      captcha.addEventHandler(
        onShow: (Map<String, dynamic> message) async {
          // 验证码视图已显示
          debugPrint("Captcha did show");
        },
        onResult: (Map<String, dynamic> message) async {
          debugPrint("Captcha result: $message");

          String status = message["status"];
          if (status == "1") {
            // 发送 message["result"] 到服务器进行二次查询
            Map result = message["result"] as Map;
            await validateCaptchaResult(result.map((key, value) => MapEntry(key.toString(), value.toString())));
          } else {
            // 验证失败,自动刷新
            debugPrint("Captcha 'onResult' state: $status");
          }
        },
        onError: (Map<String, dynamic> message) async {
          debugPrint("Captcha onError: $message");
          String code = message["code"];

          if (Platform.isAndroid) {
            // Android 平台错误处理
            if (code == "-14460") {
              // 验证码会话已取消
            } else {
              // 更多错误代码,请参考开发文档
              // https://docs.botion.com/boc/apirefer/errorcode/android
            }
          }

          if (Platform.isIOS) {
            // iOS 平台错误处理
            if (code == "-20201") {
              // 验证请求超时
            } else if (code == "-20200") {
              // 验证码会话已取消
            } else {
              // 更多错误代码,请参考开发文档
              // https://docs.botion.com/boc/apirefer/errorcode/ios
            }
          }
        },
      );
    } catch (e) {
      debugPrint("Event handler exception $e");
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  void verify() {
    debugPrint("Start captcha. Current version: $_platformVersion");
    captcha.verify();
  }

  void close() {
    debugPrint("Close captcha.");
    captcha.close();
  }

  Future<dynamic> _configurationChanged(MethodCall methodCall) async {
    debugPrint("Activity configurationChanged");
    return captcha.configurationChanged(methodCall.arguments.cast<String, dynamic>());
  }

  Future<dynamic> validateCaptchaResult(Map<String, String> result) async {
    // 提交验证码结果进行验证
    debugPrint("Captcha validateCaptchaResult");
    String validate = "Your server url";
    final response = await http.post(Uri.parse(validate),
        headers: {"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"},
        body: result);

    if (response.statusCode == 200) {
      debugPrint("Validate response: ${response.body}");
    } else {
      debugPrint("URL: $validate, Response statusCode: ${response.statusCode}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Running on: $_platformVersion\n'),
              TextButton(
                style: ButtonStyle(
                  foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
                  overlayColor: MaterialStateProperty.resolveWith<Color?>(
                    (Set<MaterialState> states) {
                      if (states.contains(MaterialState.hovered)) {
                        return Colors.blue.withOpacity(0.04);
                      }
                      if (states.contains(MaterialState.focused) || states.contains(MaterialState.pressed)) {
                        return Colors.blue.withOpacity(0.12);
                      }
                      return null; // 默认值
                    },
                  ),
                ),
                onPressed: verify,
                child: const Text('点击开始验证'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

配置参数说明

以下是 BOCSessionConfiguration 的配置参数及其说明:

参数名称 类型 说明
resourcePath String 静态资源文件路径,默认为加载本地文件路径。若无特殊需求,无需配置。若需远程文件,请设置完整路径。
protocol String 用于远程访问静态资源,默认值为 https
userInterfaceStyle BOC4UserInterfaceStyle 接口样式,枚举类型:system(系统风格)、light(正常风格)、dark(暗黑风格)。iOS 默认为 light,Android 默认为 system
backgroundColor Color 设置背景颜色,默认为透明色。
debugEnable bool 调试模式开关,默认关闭。
canceledOnTouchOutside bool 是否允许点击背景退出,默认开启。
timeout int 请求超时时间(毫秒),默认值为 iOS 的 8000,Android 的 10000
language String 语言设置,默认与系统语言一致。若系统语言不在 Botion 多语言支持范围内,则默认为中文。
additionalParameter Map<String, dynamic> 额外参数,默认为空。这些参数将被组装并提交至验证服务。

关键方法

  1. 初始化

    var config = BOCSessionConfiguration();
    config.language = "en";
    config.debugEnable = true;
    config.backgroundColor = Colors.orange;
    captcha = BocFlutterPlugin("captchaId", config);
    
  2. 验证

    captcha.verify();
    
  3. 关闭

    captcha.close();
    
  4. 添加事件处理器

    captcha.addEventHandler(
      onShow: (Map<String, dynamic> message) async { /* ... */ },
      onResult: (Map<String, dynamic> message) async { /* ... */ },
      onError: (Map<String, dynamic> message) async { /* ... */ },
    );

更多关于Flutter插件botion_flutter_plugin的安装与使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件botion_flutter_plugin的安装与使用方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


botion_flutter_plugin 是一个未知的 Flutter 插件,可能是一个自定义或第三方插件。由于它不是一个广泛使用的插件,因此没有官方的文档或社区支持。为了探索和使用这个插件,你可以按照以下步骤进行:

1. 查找插件的来源

  • 首先,确定插件的来源。它可能来自 GitHub、GitLab 或其他代码托管平台。
  • 如果插件是开源的,查看其仓库中的 README.md 文件,通常会有使用说明和示例代码。

2. 安装插件

  • pubspec.yaml 文件中添加插件的依赖项。例如:
    dependencies:
      botion_flutter_plugin: ^1.0.0
    
  • 然后运行 flutter pub get 来安装插件。

3. 导入插件

  • 在需要使用插件的 Dart 文件中导入插件:
    import 'package:botion_flutter_plugin/botion_flutter_plugin.dart';
    

4. 探索插件的功能

  • 查看插件的源代码,了解它提供了哪些类、方法和功能。
  • 如果插件有示例项目,运行示例项目来了解其使用方式。

5. 使用插件

  • 根据插件的功能,尝试在项目中使用它。例如,如果插件提供了某种 UI 组件,可以在 build 方法中使用它:
    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Botion Flutter Plugin Example'),
        ),
        body: Center(
          child: BotionWidget(), // 假设插件提供了一个名为 BotionWidget 的组件
        ),
      );
    }
    

6. 调试和测试

  • 如果插件没有按预期工作,使用调试工具来检查问题。
  • 如果插件有错误或需要改进,可以考虑提交 issue 或 pull request 到插件的仓库。

7. 参考文档和社区

  • 如果插件有文档,仔细阅读文档以了解其详细用法。
  • 如果没有文档,可以尝试在 Flutter 社区中寻求帮助,例如在 Flutter 官方论坛Stack Overflow 上提问。

8. 自定义和扩展

  • 如果插件不能满足你的需求,可以考虑对其进行自定义或扩展。你可以 fork 插件的仓库,然后根据自己的需求进行修改。

9. 保持更新

  • 如果插件是开源的,定期检查是否有更新,以获取新功能或修复的 bug。

10. 贡献

  • 如果你对插件进行了改进或修复了 bug,可以考虑贡献回社区,帮助其他开发者。

示例代码

假设 botion_flutter_plugin 提供了一个简单的按钮组件,你可以这样使用它:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Botion Flutter Plugin Example'),
        ),
        body: Center(
          child: BotionButton(
            onPressed: () {
              print('Botion Button Pressed!');
            },
            text: 'Click Me',
          ),
        ),
      ),
    );
  }
}
回到顶部