Flutter Web3加密钱包提供商检测与指定钱包连接问题
使用flutter_web3检测钱包提供商并强制连接指定钱包
1. 检测当前连接的具体钱包提供商
以太坊兼容钱包会在注入的ethereum对象上添加专属标识,我们可以通过这些标识判断钱包类型。常见钱包的标识如下:
- MetaMask:
isMetaMask - TrustWallet:
isTrust - Coinbase Wallet:
isCoinbaseWallet
修改WalletConnector类,新增钱包类型检测逻辑:
import 'package:flutter/material.dart'; import 'package:flutter_web3/ethereum.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart'; class WalletConnector { var address = ''.obs; var status = 'Disconnect'.obs; var isConnected = false.obs; var currentWallet = 'Unknown'.obs; // 存储当前连接的钱包类型 Future<void> connect() async { try { if (Ethereum.isSupported && isConnected.isFalse) { var accounts = await ethereum!.requestAccount(); if (accounts.isNotEmpty) { address.value = accounts.first; isConnected.value = ethereum!.isConnected(); status.value = 'Connected'; _detectWalletProvider(); // 连接成功后检测钱包类型 } else { status.value = 'Empty account'; } } else { status.value = 'Wallet not supported or already connected'; } } on EthereumUserRejected { status.value = 'Cancelled by user'; } } // 钱包类型检测方法 void _detectWalletProvider() { if (ethereum!.isMetaMask) { currentWallet.value = 'MetaMask'; } else if (ethereum!.isTrust) { currentWallet.value = 'TrustWallet'; } else if (ethereum!.isCoinbaseWallet) { currentWallet.value = 'Coinbase Wallet'; } else { currentWallet.value = 'Unknown Wallet'; } } Future<void> disconnect() async { address.value = ''; status.value = 'Disconnect'; isConnected.value = false; currentWallet.value = 'Unknown'; } }
在MainPage中添加钱包类型展示:
Text(_walletConnector.currentWallet.value, style: TextStyle(color: Colors.black, fontSize: 18)),
2. 强制连接指定钱包(以TrustWallet为例)
当浏览器安装多个钱包时,默认的连接流程会弹出钱包选择器。要强制连接指定钱包,需先检测该钱包是否存在,再直接使用其专属提供者发起连接请求。
修改WalletConnector类,新增指定钱包连接方法:
import 'dart:js' as js; // 导入web专用的dart:js库 // ... 原有代码不变 Future<void> connectToTrustWallet() async { try { if (isConnected.isFalse) { bool isTrustWalletAvailable = false; // 方式1:通过ethereum对象的isTrust属性判断 if (Ethereum.isSupported && ethereum!.isTrust) { isTrustWalletAvailable = true; } // 方式2:直接检测window上的trustwallet注入对象 else { isTrustWalletAvailable = js.context.hasProperty('trustwallet'); } if (isTrustWalletAvailable) { late EthereumProvider trustWalletProvider; // 获取TrustWallet的提供者实例 if (ethereum!.isTrust) { trustWalletProvider = ethereum!; } else { trustWalletProvider = EthereumProvider.fromJs(js.context['trustwallet']); } // 使用TrustWallet提供者请求账户 var accounts = await trustWalletProvider.requestAccount(); if (accounts.isNotEmpty) { address.value = accounts.first; isConnected.value = true; status.value = 'Connected to TrustWallet'; currentWallet.value = 'TrustWallet'; } else { status.value = 'Empty account'; } } else { status.value = 'TrustWallet not installed'; } } else { status.value = 'Already connected'; } } on EthereumUserRejected { status.value = 'Cancelled by user'; } catch (e) { status.value = 'Error: ${e.toString()}'; } } // ... 原有代码不变
在MainPage中替换连接按钮逻辑:
ElevatedButton( onPressed: _walletConnector.isConnected.isTrue ? null : () => _walletConnector.connectToTrustWallet(), child: Text('Connect to TrustWallet'), ),
内容的提问来源于stack exchange,提问作者mah454
相关产品推荐
相关产品推荐

