Flutter钱包连接插件wallet_connect_dart_v2的使用
Flutter钱包连接插件wallet_connect_dart_v2的使用

Wallet Connect
Wallet Connect SDK 使用 Dart 编写。 #
开始使用 #
要配置您的应用以使用最新版本的 wallet_connect_dart_v2
,请查看 pub.dev
注意:若要在 v1 SDK 旁边使用 wallet_connect_dart_v2,请参阅 wallet_connect。
Dapp 使用 #
有关 Dapp 使用的详细实现,请参见 example-dapp。
钱包使用 #
有关钱包使用的详细实现,请参见 example-wallet。
初始化 #
```dart import 'package:wallet_connect_dart_v2/wallet_connect_dart_v2.dart'; ``` ```dart final signClient = await SignClient.init( projectId: "PROJECY_ID", relayUrl: "RELAY_URL" // 或留空,使用默认值 "wss://relay.walletconnect.com", metadata: const AppMetadata( name: "Demo app", description: "Demo Client as Wallet/Peer", url: "www.walletconnect.com", icons: [], ), database: 'DB_NAME', // 可选,如果为空,则所有会话数据将存储在内存中 ); ```通过二维码配对 #
我们使用了 ScanView 来扫描二维码,你也可以使用其他任何包。
扫描二维码以获取配对 URI。
```dart ScanView( controller: ScanController(), onCapture: (data) { if (Uri.tryParse(value) != null) { signClient.pair(value); } }, ); ```通过 URI 配对 #
直接使用 pair
功能从 SignClient
实例
响应会话提议 #
当 Dapp 向用户的钱包发起新会话时,会触发 SignClientEvent.SESSION_PROPOSAL
事件。该事件将包含一个提案对象,其中包含有关 Dapp 和请求权限的信息。钱包应向用户显示提示,以便用户批准或拒绝该会话。如果批准,调用 approveSession 并传递 proposal.id 和请求的命名空间。
可以在初始化客户端时监听此事件:
```dart signClient.on(SignClientEvent.SESSION_PROPOSAL.value, (data) { final eventData = data as SignClientEventParams<RequestSessionPropose>; // 显示会话提议数据给用户,例如在一个弹出窗口中,用户可以选择批准或拒绝
const approve = true;
// 批准会话提议
if(approve) {
//
final SessionNamespaces namespaces = {
// 提供被 Dapp 请求的命名空间和链(例如 `eip155` 用于 EVM 基础链)
"eip155": SessionNamespace(
// `accounts` 地址需要根据请求的链数量从钱包端以指定格式传递
accounts: ["eip155:1:0x0000000000..., eip155:10:0x0000000000..."],
// `methods` 和 `events` 可以在 `eventData.params!.requiredNamespaces` 中访问
methods: [
"eth_sendTransaction",
"eth_signTransaction",
"eth_sign",
"personal_sign",
"eth_signTypedData",
],
events: ["chainChanged", "accountsChanged"],
)
};
final params = SessionApproveParams(
id: eventData.id!,
namespaces: namespaces,
);
signClient.approve(params);
}
// 或者拒绝会话提议
else {
final params = SessionRejectParams(
id: eventData.id!,
reason: formatErrorMessage(
error: getSdkError(SdkErrorKey.USER_DISCONNECTED),
),
);
signClient.reject(params);
}
});
<br>
<h2 id="responding-to-dapp-requests">响应 Dapp 请求 <a href="#responding-to-dapp-requests" class="hash-link">#</a></h2>
<p>当 Dapp 向钱包发送请求以执行特定操作(如签署交易)时,会触发 <code>SignClientEvent.SESSION_REQUEST</code> 事件。该事件由 Dapp 触发并接收于钱包。为了响应请求,钱包应调用特定的签名函数,并传递来自请求的详细信息。然后可以根据响应批准或拒绝请求。</p>
```dart
signClient.on(SignClientEvent.SESSION_REQUEST.value, (data) async {
final eventData = data as SignClientEventParams<RequestSessionRequest>;
final String method = eventData.params!.request.method;
// 示例处理一些 EVM 基础链的方法
if (method == "personal_sign") {
final requestParams =
(eventData.params!.request.params as List).cast<String>();
final dataToSign = requestParams[0];
final address = requestParams[1];
// 处理请求参数以生成必要的结果,并将响应发送回 Dapp。
final signedDataHex = personalSign(dataToSign, address);
// 批准请求
signClient!.respond(
SessionRespondParams(
topic: eventData.topic!,
response: JsonRpcResult<String>(
id: eventData.id!,
result: signedDataHex,
),
),
);
// 或拒绝请求
_signClient!.respond(SessionRespondParams(
topic: eventData.topic!,
response: JsonRpcError(id: eventData.id!),
));
} else if (method == "eth_sign") {
// 处理 `eth_sign`
} else if (method == "eth_signTypedData") {
// 处理 `eth_signTypedData`
} else if (method == "eth_sendTransaction") {
// 处理 `eth_sendTransaction`
} else if (method == "eth_signTransaction") {
// 处理 `eth_signTransaction`
}
});
响应 Dapp 事件 #
```dart signClient!.on(SignClientEvent.SESSION_EVENT.value, (data) { final eventData = data as SignClientEventParams<RequestSessionEvent>; // 处理事件请求 }); ```响应 Ping #
```dart signClient!.on(SignClientEvent.SESSION_PING.value, (data) { final eventData = data as SignClientEventParams<void>; // 处理 Ping 请求 }); ```响应会话删除 #
```dart signClient!.on(SignClientEvent.SESSION_DELETE.value, (data) { final eventData = data as SignClientEventParams<void>; // 处理会话删除请求 }); ```向 Dapp 发送请求 #
会话删除 #
如果 Dapp 或钱包决定断开会话,SignClientEvent.SESSION_DELETE
事件将被触发。钱包应监听此事件以更新 UI。
要从钱包断开会话,调用 disconnect
函数并传递主题和原因。您可以选择性地将断开的原因发送到 Dapp。
扩展会话 #
要扩展会话,调用 extend
方法并传递新的主题。会触发 SignClientEvent.SESSION_UPDATE
事件。
更新会话 #
当通过调用 update
更新会话时,会触发 SignClientEvent.SESSION_UPDATE
事件。
要更新会话,传递新的 SessionUpdateParams
发出会话事件 #
要发出会话事件,调用 emit
并传递参数。它接受 SessionEmitParams
作为参数。
更多关于Flutter钱包连接插件wallet_connect_dart_v2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter钱包连接插件wallet_connect_dart_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用wallet_connect_dart_v2
插件的示例代码。这个插件允许你的Flutter应用与钱包连接协议(WalletConnect)进行交互,以便与用户的加密钱包进行通信。
首先,确保你已经在pubspec.yaml
文件中添加了wallet_connect_dart_v2
依赖:
dependencies:
flutter:
sdk: flutter
wallet_connect_dart_v2: ^最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个基本的示例代码,展示如何设置和使用wallet_connect_dart_v2
插件:
main.dart
import 'package:flutter/material.dart';
import 'package:wallet_connect_dart_v2/wallet_connect_dart_v2.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late WalletConnect client;
late String uri;
@override
void initState() {
super.initState();
setupWalletConnect();
}
void setupWalletConnect() async {
// 初始化WalletConnect客户端
client = WalletConnect(
bridge: 'https://bridge.walletconnect.org', // WalletConnect桥接URL
clientMeta: ClientMeta(
name: 'My Flutter App',
description: 'A Flutter app using WalletConnect',
url: 'https://myapp.com',
icons: [
'https://myapp.com/icon.png',
],
),
);
// 监听连接事件
client.on('connect', (session) {
print('Connected to session: ${session.id}');
// 在这里处理连接成功后的逻辑
});
// 监听断开事件
client.on('disconnect', (session) {
print('Disconnected from session: ${session.id}');
// 在这里处理断开连接后的逻辑
});
// 生成一个连接URI
uri = await client.createSession();
print('Generated URI: $uri');
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('WalletConnect Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Scan this QR code to connect your wallet:'),
QrCodeImage(
data: uri,
width: 200,
height: 200,
),
],
),
),
),
);
}
}
class QrCodeImage extends StatelessWidget {
final String data;
final double width;
final double height;
QrCodeImage({required this.data, required this.width, required this.height});
@override
Widget build(BuildContext context) {
return Image.network(
'https://api.qrserver.com/v1/create-qr-code/?data=$data&size=${width}x$height',
width: width,
height: height,
);
}
}
注意事项
-
桥接URL:确保你使用的是有效的WalletConnect桥接URL。
https://bridge.walletconnect.org
是一个公开的桥接,但如果你在生产环境中使用,建议配置自己的桥接服务器以提高安全性。 -
客户端元数据:
ClientMeta
对象中的信息应该根据你的应用实际情况进行填写。 -
QR码生成:这里使用了一个简单的在线服务来生成QR码。在生产环境中,你可能希望使用更可靠的QR码生成库或方法。
-
事件监听:在
client.on('connect', ...)
和client.on('disconnect', ...)
中,你可以添加更多的逻辑来处理连接和断开事件,比如更新UI、发送请求等。 -
安全性:在实际应用中,请确保遵循最佳安全实践,比如使用HTTPS、验证用户输入等。
这个示例代码提供了一个基本的框架,你可以在此基础上添加更多的功能和逻辑来满足你的需求。