You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:35:05