Flutter支付集成插件inditrans的使用

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

Flutter支付集成插件inditrans的使用

概述

inditrans 是一个功能强大的转写库,支持大多数常见的印度/婆罗米文字。它可以在所有平台上使用,并且不需要依赖(对于转写)和服务器。它使用ffi(非Web)/wasm(Web)来实现接近原生的性能。

特性

  • 支持ITRANS切换转写与##跳过XML标签。
  • 对Tamil、Malayalam、Gurmukhi等脚本有特殊处理,优化了可读性。
  • 支持吠陀音调,适用于吠陀经文。

支持的脚本

印度/婆罗米文字

  • Assamese
  • Bengali
  • Burmese
  • Devanagari
  • Gujarati
  • Gurmukhi
  • Kannada
  • Khmer
  • Malayalam
  • Oriya
  • Sinhala
  • Tamil
  • Tamil-Extended
  • Telugu
  • Tibetan
  • Thai

拉丁/罗马文字

  • IAST
  • IPA
  • ISO 15919
  • ITRANS
  • ReadableLatin
  • TITUS

安装

在你的Flutter项目中添加inditrans插件:

flutter pub add inditrans

使用示例

首先,确保在使用任何inditrans的功能之前完成初始化:

import 'package:inditrans/inditrans.dart' as inditrans;

Future<void> main() async {
  // Init needs to complete before Inditrans could be used
  await inditrans.init();

  final result = inditrans.transliterate(
      "श्री॒ गु॒रु॒भ्यो नमः॒ । ह॒रिः॒ ओ३म् ॥",
      inditrans.Script.devanagari,
      inditrans.Script.tamil,
      inditrans.Options.IgnoreVedicAccents + inditrans.Options.TamilSuperscripted);
}

完整示例Demo

下面是一个更完整的示例代码,展示了如何在Flutter应用中测试不同转写场景:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:inditrans/inditrans.dart' as inditrans;
import 'package:google_fonts/google_fonts.dart';

class TestSpec {
  final String description;
  final String text;
  final inditrans.Script fromScript;
  final inditrans.Script toScript;
  final inditrans.Option options;
  final String expected;

  TestSpec(this.description, this.text, this.fromScript, this.toScript,
      this.options, this.expected);
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final stopwatch = Stopwatch()..start();
  await inditrans.init();

  // Load JSON asset containing test cases
  final jsonString = await rootBundle.loadString('assets/test-cases.json');

  final List<TestSpec> testCases = [];
  for (final input in jsonDecode(jsonString)) {
    final description = input['description'];
    final inputText = input['text'];
    final inputScript =
        (input['script'] as String?)?.toScript() ?? inditrans.Script.devanagari;
    for (final target in input['targets']) {
      final targetScript = (target['script'] as String?)?.toScript() ??
          inditrans.Script.devanagari;
      final expected = target['text'];
      final options = inditrans.Option(target['options'] ?? '');
      testCases.add(TestSpec(description, inputText, inputScript, targetScript,
          options, expected));
    }
  }

  runApp(MyApp(
    timeToInit: stopwatch.elapsed,
    testCases: testCases,
  ));
}

class MyApp extends StatefulWidget {
  final Duration timeToInit;
  final List<TestSpec> testCases;
  const MyApp({super.key, required this.timeToInit, required this.testCases});

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

class _MyAppState extends State<MyApp> {
  List<Widget> _runTests() {
    final List<Widget> widgets = [];
    for (int testId = 0; testId < widget.testCases.length; testId++) {
      final testCase = widget.testCases[testId];
      final actual = inditrans.transliterate(testCase.text, testCase.fromScript,
          testCase.toScript, testCase.options);
      final name =
          'Test #${testId + 1}: ${testCase.description} (${testCase.fromScript} -> ${testCase.toScript})';
      if (actual == testCase.expected) {
        widgets.add(Text(
          '$name PASSED',
          style: const TextStyle(
              fontSize: 20, fontWeight: FontWeight.bold, color: Colors.green),
          textAlign: TextAlign.left,
        ));
      } else {
        widgets.add(Text(
          '$name FAILED',
          style: const TextStyle(
              fontSize: 20, fontWeight: FontWeight.bold, color: Colors.red),
          textAlign: TextAlign.left,
        ));
        widgets.add(Text(
          'Expected: ${testCase.expected}',
          style: GoogleFonts.notoSansTamil(),
          textAlign: TextAlign.left,
        ));
        widgets.add(Text(
          'Actual: $actual',
          style: GoogleFonts.notoSansTamil(),
          textAlign: TextAlign.left,
        ));
      }
      widgets.add(const SizedBox(height: 10));
    }
    return widgets;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Native Packages'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: const EdgeInsets.all(10),
            child: Center(
                child: Column(
              children: _runTests(),
            )),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter支付集成插件inditrans的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter支付集成插件inditrans的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成Inditrans支付插件涉及到多个步骤,包括插件安装、配置以及支付功能的实现。以下是一个基本的代码案例,展示了如何在Flutter项目中使用Inditrans支付插件。

1. 安装Inditrans插件

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

dependencies:
  flutter:
    sdk: flutter
  inditrans_flutter: ^最新版本号  # 请替换为最新的版本号

然后运行flutter pub get来安装插件。

2. 配置Android和iOS支付环境

Android

android/app/src/main/AndroidManifest.xml中,你可能需要添加一些必要的权限和配置,具体取决于Inditrans插件的要求。通常,支付插件可能需要网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

iOS

对于iOS,你可能需要在Info.plist中添加一些配置,或者通过CocoaPods安装一些依赖库。这通常取决于Inditrans插件的iOS集成文档。

3. 初始化Inditrans插件

在你的Flutter项目中,你需要初始化Inditrans插件并设置必要的参数。以下是一个简单的初始化示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  InditransFlutter? _inditrans;

  @override
  void initState() {
    super.initState();
    // 初始化Inditrans插件
    _initInditrans();
  }

  Future<void> _initInditrans() async {
    _inditrans = InditransFlutter(
      clientKey: '你的Inditrans客户端密钥', // 替换为你的Inditrans客户端密钥
      environment: 'sandbox', // 'sandbox' 或 'production'
    );

    // 配置其他必要的参数,如服务器密钥、回调URL等
    // _inditrans.configure(...);
  }

  void _makePayment() async {
    if (_inditrans != null) {
      try {
        // 创建支付请求
        var paymentRequest = PaymentRequest(
          amount: 100000, // 支付金额,单位:印尼卢比
          currency: 'IDR',
          orderId: 'order_${DateTime.now().millisecondsSinceEpoch}', // 订单ID,需要唯一
          // 其他必要的支付参数,如商品描述、用户信息等
        );

        // 发起支付
        var paymentResult = await _inditrans!.startPayment(paymentRequest);
        print('支付结果: $paymentResult');
      } catch (e) {
        print('支付失败: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Inditrans支付集成'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _makePayment,
          child: Text('发起支付'),
        ),
      ),
    );
  }
}

// PaymentRequest类定义(假设Inditrans插件提供了此类,具体请参考插件文档)
class PaymentRequest {
  final int amount;
  final String currency;
  final String orderId;
  // 其他字段...

  PaymentRequest({required this.amount, required this.currency, required this.orderId});
}

注意事项

  1. 密钥管理:确保你的客户端密钥和服务器密钥安全存储,不要硬编码在客户端代码中。
  2. 支付回调:处理支付结果时,通常需要在服务器端实现回调接口,以处理支付成功或失败的情况。
  3. 错误处理:在实际应用中,需要添加更多的错误处理和用户提示。
  4. 文档参考:上述代码是一个基本示例,具体实现细节可能需要根据Inditrans插件的官方文档进行调整。

请务必参考Inditrans插件的官方文档和API参考,以确保你的集成符合最新的要求和最佳实践。

回到顶部