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

使用RainbowKit时Connect Wallet Modal显示两个Metamask选项问题

解决首次打开浏览器时钱包连接弹窗重复显示同一钱包的问题

问题根源

首次启动浏览器时,Metamask/Phantom这类钱包扩展的初始化存在延迟,但你的钱包检测逻辑可能在扩展就绪前后执行了多次,导致同一钱包被重复识别并添加到连接选项列表中。

可行解决方案

  • 优化检测时机,监听扩展就绪事件
    不要在页面加载完成后立即执行检测,而是等待钱包扩展发出的初始化完成事件,确保只在扩展完全就绪后执行一次检测:

    • Metamask检测:
      function initMetamask() {
        if (window.ethereum?.isMetaMask) {
          // 这里写添加Metamask到选项列表的逻辑
        }
      }
      
      if (window.ethereum) {
        initMetamask();
      } else {
        // 监听初始化事件,且只触发一次
        window.addEventListener('ethereum#initialized', initMetamask, { once: true });
      }
      
    • Phantom检测:
      function initPhantom() {
        if (window.phantom?.solana?.isPhantom) {
          // 这里写添加Phantom到选项列表的逻辑
        }
      }
      
      if (window.phantom?.solana) {
        initPhantom();
      } else {
        window.addEventListener('phantom#initialized', initPhantom, { once: true });
      }
      
  • 添加选项去重逻辑
    在将钱包选项加入弹窗列表前,先检查是否已有相同标识的钱包存在,避免重复添加:

    // 用Set存储已添加的钱包标识
    const registeredWallets = new Set();
    
    function addWalletToList(walletInfo) {
      // 用钱包的唯一标识做判断
      const walletKey = walletInfo.isMetaMask ? 'metamask' : walletInfo.isPhantom ? 'phantom' : walletInfo.id;
      
      if (!registeredWallets.has(walletKey)) {
        // 渲染钱包选项到弹窗
        renderWalletOption(walletInfo);
        registeredWallets.add(walletKey);
      }
    }
    
  • 确保检测逻辑只执行一次
    如果使用React这类前端框架,检查是否因组件重渲染导致检测函数重复调用。比如用空依赖数组的useEffect确保检测只执行一次:

    useEffect(() => {
      // 执行钱包检测逻辑
      checkAvailableWallets();
    }, []); // 空依赖确保只在组件挂载时执行一次
    

内容的提问来源于stack exchange,提问作者Alen Schmitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:54:58