概述
在 Flutter for OpenHarmony 里做 DApp 或加密钱包相关功能时,WalletConnect 基本绕不过去。它把应用和外部钱包连起来,签名、授权、交易这些敏感动作都留在钱包侧处理,DApp 只负责发起请求和接收结果。对鸿蒙场景来说,这种拆分很省事,也更符合安全边界。
wallet_connect 是 WalletConnect 协议的 Dart 实现。它可以让鸿蒙 App 通过二维码或深链,和 MetaMask、Trust Wallet 这类钱包建立加密连接,完成会话协商、消息转发和签名回传。
工作方式
WalletConnect 不是让两个应用直接互连,中间会经过一个 Bridge Server。DApp 先生成带会话信息的 URI,再让钱包扫码或通过 DeepLink 拉起。后续的 JSON-RPC 请求和响应都走加密通道,Bridge 只负责转发,看不到明文内容。
graph LR A["Hmos DApp (Flutter)"] -- "生成 URI (Topic/Key)" --> B["WalletConnect Bridge"] C["加密钱包 (Hmos/iOS/Android)"] -- "扫码/深链接入" --> B B -- "转发加密指令" --> A A -- "请求签名 (Eth_sendTransaction)" --> C C -- "确认并返回签名结果" --> A subgraph 核心协议 D["JSON-RPC 2.0 封装"] + E["AES-256 全文加密"] + F["会话保活 (PeerID)"] end
这套机制的好处很直接:私钥不进 DApp,鸿蒙端不需要自己处理资产安全;协议层又足够标准,换钱包通常不需要改一整套逻辑。代价也有,链路里多了 Bridge,网络差的时候体验会明显抖一下。
鸿蒙环境准备
wallet_connect 本身是纯 Dart 逻辑,底层也主要依赖标准 WebSocket,所以在 Flutter for OpenHarmony 里可以直接接进来,不需要额外塞一堆原生包。
依赖配置放在 pubspec.yaml:
dependencies:
wallet_connect: ^1.1.0
如果你的流程里要扫码或者做 DeepLink 跳转,module.json5 里还是要把相机权限和自定义 uri_scheme 处理好。这个地方通常不是库的问题,而是鸿蒙应用自己的接入细节最容易漏。
核心 API
| 类/属性 | 说明 |
|---|---|
WalletConnect | 核心连接客户端,负责维护与 Bridge 的状态 |
createSession() | 发起一个新的会话连接 |
approveSession() | 钱包端授权连接请求 |
onConnect/onSessionUpdate | 关键连接状态变更回调流 |
最小化初始化大概长这样:
import 'package:wallet_connect/wallet_connect.dart';
Future<void> initHmosWeb3Session() async {
final connector = WalletConnect(
bridge: 'https://bridge.walletconnect.org',
clientMeta: PeerMeta(
name: 'HmosDApp',
description: '基于鸿蒙系统的去中心化应用',
url: 'https://hmos.app',
icons: ['https://hmos.app/logo.png'],
),
);
// 监听连接状态
connector.on('connect', (session) {
print('鸿蒙设备已成功连接至钱包!地址:${session.accounts[0]}');
});
}


