Flutter未知功能探索插件gt4_flutter_plugin的使用

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

Flutter未知功能探索插件gt4_flutter_plugin的使用

简介

gt4_flutter_plugin 是一个官方的 Flutter 插件项目,用于集成 GeeTest Captcha v4。支持 Flutter 2.x 和 3.x 版本。

安装

在项目的 pubspec.yaml 文件的 dependencies 块中添加以下配置:

使用 Github 集成

dependencies:
  gt4_flutter_plugin:
    git:
      url: https://github.com/GeeTeam/gt4_flutter_plugin.git
      ref: master

使用 pub 集成

dependencies:
  gt4_flutter_plugin: ^0.1.2

配置

请在 官方网站 申请验证码 ID (captchaId) 和密钥,并部署匹配的后端接口。详细说明请参考:部署指南

示例

初始化

在集成之前,请先替换从后端获取的 captchaId

var config = GT4SessionConfiguration();
config.language = "en";
config.debugEnable = true;
config.backgroundColor = Colors.orange;
captcha = Gt4FlutterPlugin("123456789012345678901234567890ab", config);

配置说明

属性 属性类型 属性说明
resourcePath String 静态资源文件的路径。如果没有特殊要求加载本地文件路径,则无需配置。可以配置远程文件并应设置完整路径。
protocol String 访问远程静态资源使用的协议,默认为 “https”。
userInterfaceStyle GTC4UserInterfaceStyle 接口风格,枚举值:system 跟随系统风格,light 正常风格,dark 暗黑风格。默认为 iOS 的 light 和 Android 的 system。
backgroundColor Color 背景颜色,默认为透明。
debugEnable bool 调试模式开关,默认关闭。
canceledOnTouchOutside bool 点击背景时的交互,默认开启。
timeout int 请求超时时间,单位为毫秒,默认为 iOS 的 8000 和 Android 的 10000。
language String 语言,默认跟随系统。如果当前系统语言不被插件支持,则为简体中文。语言短码列表(ISO 639-2 标准)请参考指定语言文档。
apiServers List 控制 API 请求地址。
staticServers List 控制静态资源请求地址。
additionalParameter Map<String, dynamic> 额外配置参数,默认为空。参数将被组装并提交到服务器。

验证

captcha.verify();

关闭

captcha.close();

添加事件处理器

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.geetest.com/gt4/apirefer/errorcode/android
      }
    }

    if (Platform.isIOS) {
      // iOS 平台
      if (code == "-20201") {
        // 验证请求超时
      } else if (code == "-20200") {
        // 验证会话已取消
      } else {
        // 更多错误码参考开发文档
        // https://docs.geetest.com/gt4/apirefer/errorcode/ios
      }
    }
  }
);

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 gt4_flutter_plugin

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

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:gt4_flutter_plugin/gt4_flutter_plugin.dart';
import 'package:gt4_flutter_plugin/gt4_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](/user/override)
  State<MyApp> createState() => _MyAppState();
}

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

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

  /// 集成前,请先替换从后台申请的 `captchaId`
  late final Gt4FlutterPlugin captcha;

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在一个异步方法中初始化
  Future<void> initPlatformState() async {
    GT4SessionConfiguration config = GT4SessionConfiguration();
    config.logEnable = false;
    captcha = Gt4FlutterPlugin("123456789012345678901234567890ab", config);

    String platformVersion;
    // 平台消息可能会失败,因此我们使用 try/catch PlatformException
    // 我们还处理消息可能返回 null 的情况
    try {
      platformVersion =
          await Gt4FlutterPlugin.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");
          Fluttertoast.showToast(
            msg: message.toString(),
            toastLength: Toast.LENGTH_SHORT,
            gravity: ToastGravity.BOTTOM,
          );

          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");
          Fluttertoast.showToast(
            msg: message.toString(),
            toastLength: Toast.LENGTH_SHORT,
            gravity: ToastGravity.BOTTOM,
          );
          String code = message["code"];
          // 处理验证中返回的错误
          if (Platform.isAndroid) {
            // Android 平台
            if (code == "-14460") {
              // 验证会话已取消
            } else {
              // 更多错误码参考开发文档
              // https://docs.geetest.com/gt4/apirefer/errorcode/android
            }
          }

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

    // 如果小部件在异步平台消息飞行期间从树中移除,我们希望丢弃回复而不是调用
    // setState 更新我们的不存在的外观。
    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](/user/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: <Widget>[
              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; // Defer to the widget's default.
                    },
                  ),
                ),
                onPressed: verify,
                child: const Text('点击验证'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter未知功能探索插件gt4_flutter_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能探索插件gt4_flutter_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在探索Flutter插件gt4_flutter_plugin时,了解其功能和API是关键。尽管我无法直接访问最新的文档或源码(因为这些可能会随时间变化),但我可以提供一个通用的示例代码框架,帮助你开始使用Flutter插件。假设gt4_flutter_plugin已经正确集成到你的Flutter项目中,以下是一个基本的代码案例,展示如何初始化和使用插件:

1. 添加依赖

首先,确保你的pubspec.yaml文件中已经添加了gt4_flutter_plugin的依赖:

dependencies:
  flutter:
    sdk: flutter
  gt4_flutter_plugin: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中(例如main.dart),导入插件:

import 'package:gt4_flutter_plugin/gt4_flutter_plugin.dart';

3. 初始化插件

MainActivity.kt(对于Android)或AppDelegate.swift(对于iOS)中,你可能需要按照插件的文档进行额外的初始化设置。但大多数Flutter插件在Dart层面即可完成初始化。

4. 使用插件功能

假设gt4_flutter_plugin提供了一个名为someFeature的功能,你可以这样使用它:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GT4 Flutter Plugin Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String result = "";

  @override
  void initState() {
    super.initState();
    // 初始化插件并调用其功能
    _useGt4Plugin();
  }

  Future<void> _useGt4Plugin() async {
    try {
      // 假设插件有一个名为someFeature的方法
      String data = await Gt4FlutterPlugin.someFeature();
      setState(() {
        result = data;
      });
    } catch (e) {
      print("Error using GT4 Flutter Plugin: $e");
      setState(() {
        result = "Error: ${e.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text("Result from GT4 Flutter Plugin:"),
        Text(result),
      ],
    );
  }
}

注意事项

  1. API文档:确保阅读gt4_flutter_plugin的官方文档或GitHub仓库,以了解所有可用的方法和参数。
  2. 权限:如果插件需要特定的平台权限(如相机、位置等),请确保在AndroidManifest.xmlInfo.plist中正确配置。
  3. 错误处理:在实际应用中,添加更多的错误处理和用户反馈机制。
  4. 更新:定期检查插件的更新,以确保你的应用能够利用最新的功能和修复。

由于我无法直接访问gt4_flutter_plugin的具体实现,上述代码是基于假设的API调用someFeature。请根据你实际使用的插件功能和API进行调整。

回到顶部