Flutter钱包客户端插件archethic_wallet_client的使用

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

Flutter钱包客户端插件 archethic_wallet_client 的使用

什么是 ArchethicWallet RPC?

要了解更多关于 ArchethicWallet RPC,请参考 AEIP-4

使用方法

添加依赖

在您的项目中添加 archethic-wallet-client 依赖:

$ flutter pub add archethic-wallet-client

设置 Deeplink

如果您希望应用程序在 AndroidiOS 上工作,则必须设置应用程序的 Deeplink 端点。这是为了让 DeeplinkRPC 正常工作。

Android

AndroidManifest.xml 文件中,作为根元素的子元素添加一个 queries 元素:

<queries>
    <!-- AEWallet deeplink support -->
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data
            android:scheme="aewallet"
            android:host="archethic.tech" />
    </intent>
</queries>

.MainActivity 标签内添加 meta-dataintent-filter

<!-- AEWallet deeplink support -->
<meta-data
    android:name="flutter_deeplinking_enabled"
    android:value="true" />
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- Replace `flutterdappexample` by your custom deeplink scheme -->
    <!-- Replace `dapp.example` by your custom deeplink host -->
    <!-- These will be used to compose the replyUrl when sending RPCs -->
    <data
        android:scheme="flutterdappexample"  
        android:host="dapp.example" />
</intent-filter>

iOS

Info.plist 文件中添加 LSApplicationQueriesSchemes 条目:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>aewallet</string>
</array>

ios/Runner 目录下的 Info.plist 中添加两个新键:

<key>FlutterDeepLinkingEnabled</key>
<true/>
<key>CFBundleURLTypes</key>
<array>
    <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <!-- Replace `flutterdappexample` by your custom deeplink scheme -->
    <!-- Replace `dapp.example` by your custom deeplink host -->
    <!-- These will be used to compose the replyUrl when sending RPCs -->
    <key>CFBundleURLName</key>
    <string>dapp.example</string>
    <key>CFBundleURLSchemes</key>
    <array>
    <string>flutterdappexample</string>
    </array>
    </dict>
</array>

其他本地设置

MacOS

将以下内容添加到 macos/Runner/DebugProfile.entitlementsmacos/Runner/Release.entitlements 文件中:

<key>com.apple.security.network.client</key>
<true/>

客户端设置

实例化客户端

import 'package:archethic-wallet-client/archethic-wallet-client.dart';

// 1. 实例化客户端
final _aewalletClient = ArchethicDAppClient.auto(
  origin: const RequestOrigin(        
    name: 'FlutterDappExample',
  ),
  replyBaseUrl: 'flutterdappexample://dapp.example',    
);

[仅限 Deeplink] 监听 Deeplink 响应

onGenerateRoute 方法中处理传入的 Deeplinks:

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Dapp Demo',
      home: MyHome(),
      onGenerateRoute: (settings) {
        if ((_aewalletClient as DeeplinkArchethicDappClient)
            .handleRoute(settings.name)) return;

        //... 处理应用所需的其他路由
        return null;
      },
    );
  }
}

发出请求

final response = await _aewalletClient.sendTransaction(
    transactionJsonData,
);

response.when(
    failure: (failure) {
        log(
            'Transaction failed',
            error: failure,
        );
    },
    success: (result) {
        log(
            'Transaction succeed : ${json.encode(result)}',
        );
    },
);

RPC 方法

有两种类型的 RPC 方法:

  • 单次调用
  • 订阅(由于技术限制,订阅不适用于 Deeplink 通道)

获取 Endpoint (get_endpoint)

获取 AEWallet 使用的 Endpoint URL。

请求

// 请求体为空

成功响应

{
  "endpointUrl": String // Endpoint URL
}

刷新当前账户 (refresh_current_account)

请求钱包刷新当前账户信息。

请求

// 请求体为空

成功响应

// 无响应体

获取账户 (get_accounts)

获取 AEWallet 中可用的账户。

请求

// 请求体为空

成功响应

{
  "accounts": [
    {
      "shortName": String,      // 账户名称
      "serviceName": String     // 服务名称
      "genesisAddress": String, // 创世地址
    }
  ]
}

发送交易 (send_transaction)

签名并发送交易。

请求

{
  "type": String,                 // 交易类型
  "version": Number,              // 交易版本
  "data": Object,                 // 交易数据区
  "generateEncryptedSeedSC": bool // 是否生成加密种子
}

成功响应

{
  "transactionAddress": String,  // 发送交易的地址
  "nbConfirmations": Number,     // 已接收确认数
  "maxConfirmations": Number,    // 最大确认数
}

示例代码

以下是一个完整的示例代码,展示了如何使用 archethic_wallet_client 插件:

import 'package:archethic_wallet_client/archethic_wallet_client.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dapp_example/logger.dart';
import 'package:flutter_dapp_example/main_screen.dart';

late final ArchethicDAppClient _aewalletClient;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  LoggerSetup.instance().setup();

  _aewalletClient = await ArchethicDAppClient.auto(
    origin: const RequestOrigin(
      name: 'FlutterDappExample',
    ),
    replyBaseUrl:
        kIsWeb ? Uri.base.toString() : 'flutterdappexample://dapp.example',
  );

  await _aewalletClient.connect();

  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Archethic Wallet Client Demo',
      home: Scaffold(
        body: MainScreen(aewalletClient: _aewalletClient),
      ),
      onGenerateRoute: (settings) {
        if ((_aewalletClient as DeeplinkArchethicDappClient)
            .handleRoute(settings.name)) return;
        return null;
      },
    );
  }
}

更多关于Flutter钱包客户端插件archethic_wallet_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter钱包客户端插件archethic_wallet_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用archethic_wallet_client插件的示例代码。这个插件可能是一个假设的插件,用于与某种钱包服务进行交互。由于archethic_wallet_client并非一个真实存在的公开Flutter插件(在撰写此回复时),我将基于一般Flutter插件的使用方式来提供一个示例。

首先,确保你已经在pubspec.yaml文件中添加了archethic_wallet_client(假设它存在)作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  archethic_wallet_client: ^x.y.z  # 假设的版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用archethic_wallet_client插件:

  1. 导入插件
import 'package:archethic_wallet_client/archethic_wallet_client.dart';
  1. 初始化插件

通常,插件可能需要在应用启动时进行一些初始化。这里假设archethic_wallet_client有一个初始化方法:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化插件
  await ArchethicWalletClient.initialize();

  runApp(MyApp());
}
  1. 使用插件的功能

假设archethic_wallet_client提供了创建钱包、获取钱包余额等功能,下面是如何使用这些功能的示例代码:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await ArchethicWalletClient.initialize();

  runApp(MyApp());
}

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

class WalletScreen extends StatefulWidget {
  @override
  _WalletScreenState createState() => _WalletScreenState();
}

class _WalletScreenState extends State<WalletScreen> {
  String walletAddress = '';
  String balance = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Wallet Client Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Wallet Address:'),
            SizedBox(height: 8),
            Text(walletAddress, style: TextStyle(fontSize: 18)),
            SizedBox(height: 24),
            Text('Balance:'),
            SizedBox(height: 8),
            Text(balance, style: TextStyle(fontSize: 18)),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: () async {
                // 创建新钱包
                String newAddress = await ArchethicWalletClient.createWallet();
                setState(() {
                  walletAddress = newAddress;
                });
              },
              child: Text('Create New Wallet'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                if (walletAddress.isNotEmpty) {
                  // 获取钱包余额
                  String newBalance = await ArchethicWalletClient.getBalance(walletAddress);
                  setState(() {
                    balance = newBalance;
                  });
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Please create a wallet first!')),
                  );
                }
              },
              child: Text('Get Balance'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中有两个按钮:一个用于创建新钱包,另一个用于获取钱包的余额。这些功能都假设是通过archethic_wallet_client插件提供的。

请注意,由于archethic_wallet_client是一个假设的插件,实际的API调用和初始化过程可能会有所不同。你应该参考该插件的官方文档来获取准确的API使用方法和初始化步骤。

回到顶部