Flutter区块链交互插件web3mq_dapp_connect的使用

Flutter区块链交互插件web3mq_dapp_connect的使用

快速开始

需求

  • Dart SDK: “>=2.18.5 <4.0.0”
  • Web3MQ API Key

添加依赖

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

dependencies:
  web3mq: 0.1.0

然后运行以下命令以获取依赖项:

flutter packages get

初始化SDK

首先,你需要一个Web3MQ API密钥。详情可以查看:Web3MQ文档

初始化SDK的示例如下:

import 'package:web3mq/web3mq.dart';
import 'package:web3mq/utils_api.dart';

final client = DappConnectClient(
    'App-Key',
    baseURL: TestnetEndpoint.sg1,
    appMedata);
// 建立实际连接
await client.connectUser();

提示:

你可以自定义 baseURL,默认值为 TestnetEndpoint.sg1,或者使用 UtilsApi().findTheLowestLatencyEndpoint() 获取具有最低延迟的端点并将其分配给 baseURL

会话管理

会话是一个包含dapp和钱包之间连接信息的对象。它包含一个唯一的标识符 topic,你可以用它向钱包发送请求。

会话管理默认启用。这意味着SDK会自动缓存会话中的所有信息,如请求和响应。你可以通过调用 client.sessions 获取会话列表。你可以通过调用 client.cleanup() 清除所有会话,或者通过调用 client.deleteSession(topic) 删除单个会话。

对于钱包

接收会话提议

  1. 注册会话提议订阅者:
client.sessionProposalStream.listen((proposal) {
    // 你应该呈现一个模型来展示该提议,并让用户可以选择批准或拒绝。
    
    // 如果批准,你应该准备你支持的 `SessionNamespaces`。
    try {
        await client.approveSessionProposal(proposal.id, sessionNamespaces);
    } catch (e) {
        // 处理异常
    }

    // 如果拒绝
    try {
        await client.rejectSessionProposal(proposal.id);
    } catch (e) {
        // 处理异常
    }
});
  1. 当收到深度链接时:
final uri = DappConnectURI(string: urlString);
client.pairURI(uri);

接收请求

dappConnectClient.requestStream.listen((request) {
    // 处理请求
    switch (request.method) {
      case 'personal_sign':
        // 作为签名请求,参数应该是一个字符串数组,表示 [消息, 地址, 密码]
        final params = request.params;
        // 调用你的签名函数并获取签名
        final signature = yourSign(params);
        // 然后发送成功响应
        dappConnectClient.sendSuccessResponse(request, signature);
        // 或者发送错误响应
        dappConnectClient.sendErrorResponse(request, 50001, 'some error message');
        break;
      default:
    }
});

发送响应

// 对于错误
await client.sendErrorResponse(request, code, message);
// 对于成功
await client.sendSuccessResponse(request, result);

对于Dapp

发送会话提议

在你可以向钱包发送请求之前,你需要通过调用此方法向钱包提供一个 SessionProposal

try {
    final session = await dappConnectClient.connectWallet(requiredNamespaces);
} on DappConnectError {
    // 处理超时错误
} on RPCError {
    // 处理RPC错误
}

上述代码将生成一个支持CAIPs的 SessionProposal 并通过深度链接发送到钱包。如果钱包批准了提议,函数返回一个 Session 对象;否则抛出 RPCError,其中包含错误代码和消息。如果钱包侧3分钟内无响应,则抛出 TimeoutError

会话列表

final sessions = await client.sessions;

发送请求

// 1. 准备你的请求内容,可以是任何继承 `Codable` 的对象
final params = "just a string";
final method = "a method name";

// 获取 `session.topic` 并发送请求
await client.sendRequest(session.topic, method, params);

接收响应

try {
    final response = await client.sendRequest(session.topic, method, params);
} on DappConnectError {
    // 处理超时错误
} on RPCError {
    // 处理RPC错误
}

personal_sign

我们提供了一个方便的函数用于 personal_sign,因此你可以轻松地获取签名:

do {
    final signature = await client.personalSign(message, address, topic);
} on DappConnectError {
    // 处理超时错误
} on RPCError {
    // 处理RPC错误
} catch(e) {
    // 处理未知错误
}

更多关于Flutter区块链交互插件web3mq_dapp_connect的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter区块链交互插件web3mq_dapp_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


web3mq_dapp_connect 是一个用于在 Flutter 应用中与区块链进行交互的插件。它允许开发者轻松地集成区块链功能,并与去中心化应用(DApps)进行交互。以下是如何使用 web3mq_dapp_connect 插件的指南。

1. 安装插件

首先,你需要在 pubspec.yaml 文件中添加 web3mq_dapp_connect 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  web3mq_dapp_connect: ^0.1.0  # 请确保使用最新版本

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

2. 初始化插件

在你的 Flutter 应用中,首先需要初始化 web3mq_dapp_connect 插件。

import 'package:web3mq_dapp_connect/web3mq_dapp_connect.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化插件
  await Web3MQDAppConnect.initialize();
  
  runApp(MyApp());
}

3. 连接到区块链钱包

使用 web3mq_dapp_connect 插件,你可以连接到支持的钱包(如 MetaMask、Trust Wallet 等)。

import 'package:web3mq_dapp_connect/web3mq_dapp_connect.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter DApp'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                // 连接到钱包
                final wallet = await Web3MQDAppConnect.connect();
                print('Connected to wallet: ${wallet.address}');
              } catch (e) {
                print('Failed to connect to wallet: $e');
              }
            },
            child: Text('Connect Wallet'),
          ),
        ),
      ),
    );
  }
}

4. 发送交易

连接到钱包后,你可以使用插件的功能来发送交易或调用智能合约。

import 'package:web3mq_dapp_connect/web3mq_dapp_connect.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter DApp'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                // 连接到钱包
                final wallet = await Web3MQDAppConnect.connect();
                print('Connected to wallet: ${wallet.address}');

                // 发送交易
                final transaction = Transaction(
                  to: '0xRecipientAddress',
                  value: '1000000000000000000', // 1 ETH
                  gas: '21000',
                );

                final txHash = await wallet.sendTransaction(transaction);
                print('Transaction sent with hash: $txHash');
              } catch (e) {
                print('Failed to send transaction: $e');
              }
            },
            child: Text('Send Transaction'),
          ),
        ),
      ),
    );
  }
}

5. 与智能合约交互

你还可以使用插件与智能合约进行交互。首先,你需要获取智能合约的 ABI 和地址。

import 'package:web3mq_dapp_connect/web3mq_dapp_connect.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter DApp'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                // 连接到钱包
                final wallet = await Web3MQDAppConnect.connect();
                print('Connected to wallet: ${wallet.address}');

                // 智能合约地址和 ABI
                final contractAddress = '0xYourContractAddress';
                final contractAbi = '[{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]';

                // 创建合约实例
                final contract = Contract(contractAddress, contractAbi);

                // 调用合约方法
                final result = await contract.call('getValue', []);
                print('Contract call result: $result');
              } catch (e) {
                print('Failed to interact with contract: $e');
              }
            },
            child: Text('Call Contract'),
          ),
        ),
      ),
    );
  }
}

6. 断开连接

当你不再需要与钱包交互时,可以断开连接。

await Web3MQDAppConnect.disconnect();
回到顶部