Flutter插件ton的使用_Ton SDK for Flutter用于钱包管理与助记词工具

Flutter插件ton的使用_Ton SDK for Flutter用于钱包管理与助记词工具

简介

Ton SDK for Flutter。 该项目使用 org.ton:ton-kotlin:0.2.15 进行原生 Android 调用,并使用 https://github.com/toncenter/tonweb-mnemonic 进行 Web 支持,目前还不支持 Linux 和 Windows。

捐赠支持

如果您喜欢这个库并希望支持其开发,可以向此 TON 地址捐款:

UQDKcML9_qEz_YsiUtxxIzaEBwCfAiCfKnM1oHIw5qIVO67S

您也可以通过我的 PizzaTon 活动 进行捐款。

开始使用

初始化Ton变量

首先,需要初始化一个 Ton 变量。

final _tonPlugin = Ton();

生成随机助记词

生成随机助记词:

_tonPlugin.randomMnemonic();

该函数将返回一个包含字符串列表的 Future,这些字符串是您的钱包种子。

带密码生成随机助记词

如果助记词有密码,则可以传递密码作为参数。

_tonPlugin.randomMnemonic(password: "YOUR_WALLET_PASSWORD");

该函数同样会返回一个包含字符串列表的 Future,这些字符串是您的钱包种子。

检查助记词是否有效

检查助记词是否有效:

mnemonic = ['a', 'b', ...];
_tonPlugin.isMnemonicValid(mnemonic);

您还可以传递助记词的密码。

Web配置

在项目中添加 web 目录下的文件到您的项目中,并在 index.html 文件中添加以下脚本:

<script src="ton-mnemonic/web/index.js"></script>

文件可以在以下位置找到: Web Mnemonic 库

Ton Connect

您可以在这里找到关于 Ton Connect 的文档: Ton Connect 文档

实现Ton Connect钱包连接

  1. 将您的应用包裹在 TonConnectUiProvider 中。
  2. 在任何内部小部件中使用 TonConnectButton

完整示例代码

以下是一个完整的示例代码,展示了如何使用 Ton 插件生成随机助记词并验证其有效性。

import 'dart:convert';

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

import 'package:flutter/services.dart';
import 'package:ton/ton.dart';
import 'package:ton/tonconnect_ui/components/tonconnect_ui_provider.dart';

import 'tonconnect/tonconnect_test_page.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      builder: (context, child) {
        return TonConnectUiProvider(
          manifestUrl:
              'https://raw.githubusercontent.com/XaBbl4/pytonconnect/main/pytonconnect-manifest.json',
          child: child!,
        );
      },
      home: HomeWidget(),
    );
  }
}

class HomeWidget extends StatefulWidget {
  const HomeWidget({super.key});

  [@override](/user/override)
  State<HomeWidget> createState() => _HomeWidgetState();
}

class _HomeWidgetState extends State<HomeWidget> {
  String _platformVersion = 'Unknown';
  final _tonPlugin = Ton();

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用 try/catch PlatformException。
    // 我们还处理消息可能返回 null 的情况。
    try {
      platformVersion = await _tonPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果小部件在异步平台消息仍在飞行时从树中移除,我们希望丢弃回复而不是调用
    // setState 来更新我们的不存在的外观。
    if (!mounted) return;

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            children: [
              Text('运行于: $_platformVersion\n'),
              FutureBuilder(
                  future: _tonPlugin.randomMnemonic(password: "HELLOWORLD"),
                  builder: (context, snapshot) {
                    if (snapshot.hasError) {
                      return Text(snapshot.error.toString());
                    }

                    if (snapshot.hasData && snapshot.data != null) {
                      return Column(
                        children: [
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              const Text(
                                '助记词:',
                                style: TextStyle(fontWeight: FontWeight.bold),
                              ),
                              Expanded(
                                child: FutureBuilder(
                                  future:
                                  _tonPlugin.isMnemonicValid(snapshot.data!, 'HELLOWORLD'),
                                  builder: (context, snapshot) {
                                    if (snapshot.hasError) {
                                      return Text(
                                        snapshot.error.toString(),
                                        textAlign: TextAlign.end,
                                        maxLines: 1,
                                      );
                                    }

                                    if (snapshot.hasData && snapshot.data != null) {
                                      return Text(
                                        snapshot.data! ? '有效' : '无效',
                                        textAlign: TextAlign.end,
                                        maxLines: 1,
                                      );
                                    }

                                    return const CircularProgressIndicator();
                                  },
                                ),
                              ),
                            ],
                          ),
                          Text(snapshot.data!.join(', ')),
                          const Divider(),
                          FutureBuilder(
                            future: _tonPlugin.toSeed(snapshot.data!),
                            builder: (context, snapshot) {
                              if (snapshot.hasError) {
                                return Text(snapshot.error.toString());
                              }

                              if (snapshot.hasData && snapshot.data != null) {
                                return Column(
                                  children: [
                                    const Text(
                                      '种子:',
                                      style: TextStyle(fontWeight: FontWeight.bold),
                                    ),
                                    Text(base64Encode(snapshot.data!)),
                                    const Divider(),
                                  ],
                                );
                              }

                              return const Text('正在将助记词转换为种子...');
                            },
                          ),
                        ],
                      );
                    }

                    return const Text('正在生成随机助记词...');
                  }),
              ElevatedButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => const TonConnectTestPage(),
                      ));
                },
                child: const Text('Ton Connect UI'),
              )
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter插件ton的使用_Ton SDK for Flutter用于钱包管理与助记词工具的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件ton的使用_Ton SDK for Flutter用于钱包管理与助记词工具的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,基于您对Flutter插件 ton 的描述(虽然介绍为undefined),我会尝试根据插件名称和一些常见的Flutter插件功能进行合理推测,并给出一个示例代码框架,展示如何在Flutter项目中集成和使用一个假想的插件。请注意,由于实际插件的功能未知,以下代码仅作演示用途。

假设插件 ton 的功能

假设 ton 插件提供了一些与通知(Notifications)相关的功能,比如显示本地通知或处理远程通知。

Flutter项目结构

首先,确保您的Flutter项目结构如下:

my_flutter_app/
├── android/
├── ios/
├── lib/
│   ├── main.dart
│   └── services/
│       └── ton_service.dart
├── pubspec.yaml
└── ...

pubspec.yaml

pubspec.yaml 文件中添加对 ton 插件的依赖(注意:这里是一个假设的依赖项,实际使用时需要替换为真实插件的依赖):

dependencies:
  flutter:
    sdk: flutter
  ton: ^0.0.1  # 假设的版本号,实际使用时需要替换为真实版本号

main.dart

main.dart 中导入并使用 ton_service

import 'package:flutter/material.dart';
import 'package:my_flutter_app/services/ton_service.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Ton Plugin Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final TonService tonService = TonService();
              await tonService.showLocalNotification(
                title: 'Hello',
                body: 'This is a local notification from the ton plugin!',
              );
            },
            child: Text('Show Notification'),
          ),
        ),
      ),
    );
  }
}

ton_service.dart

lib/services/ton_service.dart 中定义 TonService 类,并封装插件的功能:

import 'package:flutter/services.dart';
import 'package:ton/ton.dart';  // 假设的导入路径,实际使用时需要替换为真实路径

class TonService {
  static const MethodChannel _channel = MethodChannel('com.example.ton');

  Future<void> showLocalNotification({required String title, required String body}) async {
    try {
      await _channel.invokeMethod('showLocalNotification', {
        'title': title,
        'body': body,
      });
    } on PlatformException catch (e) {
      print("Failed to show notification: '${e.message}'.");
    }
  }

  // 可以在这里添加更多与ton插件相关的功能方法
}

注意

  1. 插件实际功能:上述代码是基于假设的插件功能编写的。实际使用时,您需要查阅插件的官方文档,了解其具体提供的方法和参数。
  2. MethodChannel:如果插件是通过 MethodChannel 与原生代码通信的,上述代码框架是适用的。如果插件使用了其他通信机制(如 EventChannel),则需要相应地调整代码。
  3. 错误处理:在实际应用中,您可能需要添加更详细的错误处理和日志记录。

希望这个示例能够帮助您开始使用假设的 ton 插件。如果您有更多关于插件具体功能的信息,我可以提供更精确的帮助。

回到顶部