Flutter钱包连接插件wallet_connect_v2的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter钱包连接插件wallet_connect_v2的使用

WalletConnect V2 for Flutter

WalletConnect V2 是一个用于Flutter的插件,它允许DApp和钱包之间建立安全的连接。这个插件适用于Flutter开发的钱包和DApp应用,并且在Avacus上得到了全面的支持,用户可以体验到主网和测试网的功能,因为它支持网络定制化。

如果您有任何问题或需要帮助,请随时使用并提出问题。

开始使用

初始化

为了方便您理解和实现,我们在示例中详细描述了每一步骤,您可以根据需要调整为钱包或DApp的具体实现。

  1. 导入并创建实例

    import 'package:wallet_connect_v2/wallet_connect_v2.dart';
    
    final _client = WalletConnectV2();
    
  2. 初始化WalletConnect SDK

    _client.init(projectId: projectId, appMetadata: walletMetadata);
    
  3. 监听必要的事件

    • 监听连接状态变化(适用于钱包和DApp)

      _client.onConnectionStatus = (isConnected) {
        // 根据连接状态更新UI等操作
      };
      
    • 监听来自DApp的会话提案(仅限钱包)

      _client.onSessionProposal = (proposal) {
        // 处理会话提案,可以选择接受或拒绝
      };
      
    • 监听新建立的会话(适用于钱包和DApp)

      _client.onSessionSettle = (session) {
        // 获取会话详情信息
      };
      
    • 其他事件监听(如会话更新、删除、请求等)请参阅上面提供的代码片段。

  4. 连接与断开连接

    • 连接到Relay服务

      _client.connect();
      
    • 断开与Relay服务的连接

      _client.disconnect();
      
  5. 配对与会话管理

    • 钱包端配对DApps

      _client.pair(uri: uri);
      
    • 批准或拒绝会话

      _client.approveSession(approval: approval); // 批准
      _client.rejectSession(proposalId: proposal.id); // 拒绝
      
    • 更新或断开会话

      _client.updateSession(approval: updateApproval); // 更新
      _client.disconnectSession(topic: topic); // 断开
      
  6. 处理请求

    • 批准或拒绝请求(仅限钱包)

      _client.approveRequest(topic: topic, requestId: requestId, result: result); // 批准
      _client.rejectRequest(topic: topic, requestId: requestId); // 拒绝
      
    • DApp端创建配对和发送请求

      _client.createPair(namespaces: namespaces); // 创建配对
      _client.sendRequest(request: request); // 发送请求
      

示例代码

以下是一个完整的Flutter应用程序示例,演示如何使用wallet_connect_v2插件来创建一个简单的钱包连接界面:

import 'package:flutter/material.dart';
import 'package:wallet_connect_v2/wallet_connect_v2.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomeView(),
    );
  }
}

class HomeView extends StatefulWidget {
  const HomeView({super.key});

  @override
  State<HomeView> createState() => _HomeViewState();
}

class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
  static const projectId = 'YOUR_PROJECT_ID'; // 替换为您的项目ID
  final _walletConnectV2Plugin = WalletConnectV2();
  final _walletMetadata = AppMetadata(
      name: 'Flutter Wallet',
      url: 'https://yourwebsite.com',
      description: 'Your Flutter Wallet Description',
      icons: ['https://yourwebsite.com/icon.png'],
      redirect: 'wcexample');

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
    _initWalletConnect();
  }

  Future<void> _initWalletConnect() async {
    await _walletConnectV2Plugin.init(
        projectId: projectId, appMetadata: _walletMetadata);
    _walletConnectV2Plugin.connect();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Wallet Connect Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            try {
              final uri = await _walletConnectV2Plugin.createPair(namespaces: {
                'eip155': ProposalNamespace(chains: [
                  'eip155:1'
                ], methods: [
                  "eth_signTransaction",
                  "eth_sendTransaction",
                  "personal_sign",
                  "eth_signTypedData"
                ], events: [])
              });
              if (uri != null) {
                print('QR Code URI: $uri');
                // 在这里可以生成二维码供扫描
              }
            } catch (e) {
              print('Error creating pair: $e');
            }
          },
          child: const Text('Create Pair'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _walletConnectV2Plugin.dispose();
    super.dispose();
  }
}

在这个示例中,我们展示了如何初始化WalletConnect V2插件,并创建一个配对URI以供扫描。实际应用中,您可能还需要处理更多的交互逻辑,比如响应不同的事件、显示二维码等。上述代码提供了一个基础框架,您可以在此基础上进行扩展以满足具体需求。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用wallet_connect_v2插件的基本示例。这个插件允许你的Flutter应用与WalletConnect兼容的钱包进行交互。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加wallet_connect_v2依赖:

dependencies:
  flutter:
    sdk: flutter
  wallet_connect_v2: ^最新版本号  # 请替换为实际的最新版本号

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

2. 初始化WalletConnect客户端

在你的Flutter应用中,你需要初始化一个WalletConnect客户端。下面是一个基本的初始化示例:

import 'package:flutter/material.dart';
import 'package:wallet_connect_v2/wallet_connect_v2.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late WalletConnect _walletConnect;

  @override
  void initState() {
    super.initState();
    _initWalletConnect();
  }

  void _initWalletConnect() {
    _walletConnect = WalletConnect(
      bridge: 'https://bridge.walletconnect.org',  // 替换为你的桥接URL
      clientMeta: ClientMeta(
        name: 'My Flutter App',
        description: 'A Flutter app using WalletConnect v2',
        url: 'https://example.com',
        icons: [
          'https://example.com/icon-128x128.png',
          'https://example.com/icon-192x192.png',
          'https://example.com/icon-512x512.png',
        ],
      ),
    );

    _walletConnect.on('session_request', (payload) async {
      // 处理会话请求
      print('Received session request: $payload');
      // 批准或拒绝会话请求
      // await _walletConnect.approveSessionRequest(payload.id);
      // 或者
      // await _walletConnect.rejectSessionRequest(payload.id);
    });

    _walletConnect.on('session_updated', (payload) {
      // 处理会话更新
      print('Session updated: $payload');
    });

    _walletConnect.on('call_request', (payload) async {
      // 处理调用请求
      print('Received call request: $payload');
      // 批准或拒绝调用请求
      // await _walletConnect.approveCallRequest(payload.id, result: {...});
      // 或者
      // await _walletConnect.rejectCallRequest(payload.id, error: {...});
    });

    // 开始监听会话
    _walletConnect.startSession();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WalletConnect Example'),
        ),
        body: Center(
          child: Text('Check console for WalletConnect events'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _walletConnect.killSession();
    super.dispose();
  }
}

3. 发送交易请求

一旦你与钱包建立了连接,你可以发送交易请求。下面是一个发送ERC-20代币转账请求的示例:

Future<void> _sendTokenTransfer() async {
  if (!_walletConnect.connected) {
    print('No active session. Please connect a wallet first.');
    return;
  }

  final request = JsonRpcRequest(
    method: 'eth_sendTransaction',
    params: [
      {
        'from': _walletConnect.session?.accounts?.first,
        'to': '0xReceiverAddress',  // 替换为接收者的地址
        'gas': '0x76c0',  // 替换为适当的gas值
        'gasPrice': '0x3b9aca00',  // 替换为适当的gas价格
        'value': '0x0',  // 如果发送ETH,则设置此值;对于ERC-20,使用data字段
        'data': '0xa9059cbb000000000000000000000000ReceiverAddress0000000000000000000000000000000000000000000000123456',  // 替换为ERC-20转账的data字段,其中最后部分为代币数量
        'chainId': '0x1',  // 替换为你的链ID
      },
    ],
    id: 1,
  );

  try {
    final response = await _walletConnect.sendCustomRequest(request);
    print('Transaction sent: $response');
  } catch (e) {
    print('Error sending transaction: $e');
  }
}

你可以在UI中添加一个按钮来触发这个函数,例如:

body: Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      Text('Check console for WalletConnect events'),
      SizedBox(height: 20),
      ElevatedButton(
        onPressed: _sendTokenTransfer,
        child: Text('Send Token Transfer'),
      ),
    ],
  ),
),

注意

  • 确保你已经正确配置了ClientMeta信息,包括应用名称、描述、URL和图标。
  • bridge URL应该是你选择的WalletConnect桥接服务的URL。
  • 在真实应用中,处理用户输入和错误是非常重要的,这里仅提供了基本示例。
  • 始终确保你的应用遵循最佳安全实践,特别是在处理加密货币交易时。

这个示例应该能帮助你开始使用wallet_connect_v2插件来连接和管理WalletConnect会话。根据实际需求,你可能需要扩展和修改这个基础代码。

回到顶部