Flutter Web3交互插件web3mq的使用

Flutter Web3交互插件web3mq的使用

快速开始

要求

  • Dart SDK: “>=2.18.5 <4.0.0”
  • 需要一个 Web3MQ API 密钥

添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖项,使用最新版本:

dependencies:
  web3mq: 0.1.2

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

flutter packages get

示例项目

在项目的 example 文件夹中有一个详细的 Flutter 示例项目。你可以直接运行并进行测试。


设置API客户端

首先,你需要实例化一个聊天客户端。该客户端将管理 API 调用、事件处理,并维护与 Web3MQ 服务器的 WebSocket 连接。你应该只创建一次客户端并在整个应用程序中重用它。

final client = Web3MQClient("api-key");

日志记录

默认情况下,聊天客户端会将所有级别为 Warn 或 Error 的消息写入到标准输出。

修改日志级别

在开发过程中,你可能希望启用更多日志信息。可以通过在构造客户端时更改默认的日志级别来实现。

final client = Web3MQClient("api-key", logLevel: Level.INFO);

自定义日志处理器

你可以直接处理日志消息,而不是让它们写入到 stdout。如果你使用错误跟踪工具或希望将日志集中到一个设施中,这非常方便。

myLogHandlerFunction = (LogRecord record) {
  // 对记录执行某些操作(例如,将其发送到 Sentry 或 Fabric)
};

final client = Web3MQClient("api-key", logHandlerFunction: myLogHandlerFunction);

钱包连接器

SDK 提供的一些方法需要钱包签名,因此在调用这些方法之前应设置 WalletConnector

client.walletConnector = walletConnector;

钱包连接器接口定义如下:

abstract class WalletConnector {
  /// 获取个人签名。
  Future<String> personalSign(String message, String address, {String? password});

  /// 连接钱包并获取用户钱包信息。
  Future<Wallet> connectWallet();
}

abstract class Wallet {
  /// accountId 支持 CAIP-10
  final List<String> accounts;

  Wallet(this.accounts);
}

离线存储

为了添加数据持久性,可以扩展 PersistenceClient 类并将其实例传递给 ChatClientWeb3MQPersistenceClient 是默认实现。

client.persistenceClient = Web3MQPersistenceClient();

注册

对于任何首次使用 Web3MQ 网络的用户,您需要在 Web3MQ 网络上注册。

此方法需要钱包签名,请确保已经设置了 WalletConnectorRegisterResponse 包含您的 PrivateKeyUserId

// 将私钥保存在一个安全的地方!
final registerResponse = await client.register(did, password);

获取私钥

任何时候,您都可以通过此方法检索自己的 PrivateKey

// 将私钥保存在一个安全的地方!
final privateKeyHex = await client.retrievePrivateKey(did, password);

连接

获取用户

通过 DID 和密码获取用户,同时指定过期时间。

final user = await client.user(did, password, expiredDuration);

或者如果已有 PrivateKey

final user = await client.user(did, privateKeyHex, expiredDuration);

您可以持久化 user 以便下次连接。

使用用户连接

现在可以使用 User 连接到 Web3MQ。

await client.connectUser(user);

监听 wsConnectionStatusStream 以跟踪连接状态:

client.wsConnectionStatusStream.listen((event) { 
  // 处理事件 
});

通知

订阅

通过 topicId 订阅主题,然后可以从该主题接收通知。

client.subscribeTopic(topicId);

接收通知

您可以使用以下方法从 Web3MQ 服务器订阅通知。

client.notificationStream.listen((notifications) {
  // 处理通知。
});

读取状态

可能需要另一方知道您是否已阅读通知。

client.markNotificationsRead(notificationsIds);

查询

可以通过类型和分页查询所有历史通知。

Page<Notification> res = await client.queryNotifications(type, pagination);

聊天

频道列表

为了跟踪频道列表,监听 <code>channelsStream</code> 事件:

client.state.channelsStream.listen((event) {
  // 处理频道列表
});

发送消息

要发送文本消息,请调用带有消息文本和主题 ID 的 <code>sendText</code> 方法。

client.sendText('hello, world!', topicId);

消息发送状态

要接收有关消息发送状态的更新,请监听 <code>messageUpdated</code> 事件:

client.on(EventType.messageUpdated).listen((event) {
  // 处理消息状态更新
  final status = event.messageStatusResponse;
});

接收新消息

要接收新消息,请监听 <code>newMessageStream</code> 事件:

client.newMessageStream.listen((message) {
  // 处理新消息
});

查询消息列表

要查询消息列表,请调用带有主题 ID 和分页对象的 <code>queryMessagesByTopic</code> 方法。

client.queryMessagesByTopic('topicId', pagination);

创建线程

要创建线程,请调用带有原始消息 ID、主题 ID 和线程名称的 <code>createThreadByMessage</code> 方法。

client.createThreadByMessage(messageId, 'topicId', 'threadName');

线程列表

要通过给定的主题查询线程列表。

final list = await client.threadListByTopic('topicId');

示例代码

以下是完整的示例代码:

import 'package:web3mq/web3mq.dart';

Future<void> main() async {
  final client = Web3MQClient('api-key');

  final user = User("userId", DID("type", "value"), "sessionKey");
  await client.connectUser(user);

  client.notificationStream.listen((event) {
    // 处理通知
  });

  // 发送消息
  client.sendText('text', 'topic');

  client.newMessageStream.listen((event) {
    // 处理新消息
  });
}

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

1 回复

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


在Flutter中与Web3进行交互可以通过使用一些插件或库来实现。web3mq 是一个用于与Web3进行交互的插件,它可以帮助你在Flutter应用中与以太坊区块链进行通信。以下是如何在Flutter项目中使用 web3mq 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  web3mq: ^0.1.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化 Web3MQ

在你的Flutter应用中,首先需要初始化 Web3MQ 实例。

import 'package:web3mq/web3mq.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Web3MQ
  Web3MQ web3mq = Web3MQ();
  
  // 连接到以太坊节点
  await web3mq.connect(
    rpcUrl: 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID',
    wsUrl: 'wss://mainnet.infura.io/ws/v3/YOUR_INFURA_PROJECT_ID',
  );
  
  runApp(MyApp(web3mq: web3mq));
}

3. 与智能合约交互

你可以使用 web3mq 来与智能合约进行交互。首先,你需要智能合约的ABI和地址。

import 'package:web3mq/web3mq.dart';

class MyApp extends StatelessWidget {
  final Web3MQ web3mq;

  MyApp({required this.web3mq});

  Future<void> interactWithContract() async {
    // 智能合约的ABI和地址
    const contractAbi = '[YOUR_CONTRACT_ABI]';
    const contractAddress = '0xYourContractAddress';

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

    // 调用合约方法
    final result = await contract.method('yourMethodName', [param1, param2]).call();

    print('Result: $result');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Web3MQ Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: interactWithContract,
            child: Text('Interact with Contract'),
          ),
        ),
      ),
    );
  }
}

4. 发送交易

你也可以使用 web3mq 来发送交易。

Future<void> sendTransaction() async {
  // 获取账户地址
  final account = web3mq.account;

  // 创建交易
  final transaction = web3mq.transaction(
    to: '0xRecipientAddress',
    value: BigInt.from(1000000000000000000), // 1 ETH
  );

  // 发送交易
  final receipt = await web3mq.sendTransaction(transaction);

  print('Transaction Receipt: $receipt');
}

5. 监听事件

你可以使用 web3mq 来监听智能合约中的事件。

Future<void> listenToEvents() async {
  // 智能合约的ABI和地址
  const contractAbi = '[YOUR_CONTRACT_ABI]';
  const contractAddress = '0xYourContractAddress';

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

  // 监听事件
  final subscription = contract.events.listen((event) {
    print('Event: $event');
  });

  // 取消监听
  subscription.cancel();
}

6. 处理错误

在使用 web3mq 时,确保处理可能出现的错误。

try {
  final result = await contract.method('yourMethodName', [param1, param2]).call();
  print('Result: $result');
} catch (e) {
  print('Error: $e');
}

7. 断开连接

在应用退出或不再需要与Web3交互时,确保断开连接。

void dispose() {
  web3mq.disconnect();
}
回到顶部