Flutter钱包连接插件wallet_connect_dart_v2的使用

Flutter钱包连接插件wallet_connect_dart_v2的使用

Wallet Connect Logo

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

  1. 初始化
  2. 通过二维码配对
  3. 通过 URI 配对
  4. 响应会话提议
  5. 响应 Dapp 请求
  6. 响应 Dapp 事件
  7. 响应 Ping
  8. 响应会话删除
  9. 向 Dapp 发送请求

初始化 #

```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 实例

```dart await signClient.pair(value); ```

响应会话提议 #

当 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。

```dart await signClient.disconnect(topic: "TOPIC"); ```

扩展会话 #

要扩展会话,调用 extend 方法并传递新的主题。会触发 SignClientEvent.SESSION_UPDATE 事件。

```dart await signClient.extend("TOPIC"); ```

更新会话 #

当通过调用 update 更新会话时,会触发 SignClientEvent.SESSION_UPDATE 事件。 要更新会话,传递新的 SessionUpdateParams

```dart await signClient.update(params); ```

发出会话事件 #

要发出会话事件,调用 emit 并传递参数。它接受 SessionEmitParams 作为参数。

```dart final SessionEmitParams params = SessionEmitParams( topic: "TOPIC", event: SessionEmitEvent( name: "NAME", data: ["DATA_1"], ), chainId: "CHAIN_ID"); await signClient.emit(params);

更多关于Flutter钱包连接插件wallet_connect_dart_v2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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,
    );
  }
}

注意事项

  1. 桥接URL:确保你使用的是有效的WalletConnect桥接URL。https://bridge.walletconnect.org是一个公开的桥接,但如果你在生产环境中使用,建议配置自己的桥接服务器以提高安全性。

  2. 客户端元数据ClientMeta对象中的信息应该根据你的应用实际情况进行填写。

  3. QR码生成:这里使用了一个简单的在线服务来生成QR码。在生产环境中,你可能希望使用更可靠的QR码生成库或方法。

  4. 事件监听:在client.on('connect', ...)client.on('disconnect', ...)中,你可以添加更多的逻辑来处理连接和断开事件,比如更新UI、发送请求等。

  5. 安全性:在实际应用中,请确保遵循最佳安全实践,比如使用HTTPS、验证用户输入等。

这个示例代码提供了一个基本的框架,你可以在此基础上添加更多的功能和逻辑来满足你的需求。

回到顶部