微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Web3-react 保持 MetaMask 与 UI 的连接?

如何解决如何使用 Web3-react 保持 MetaMask 与 UI 的连接?

我正在使用 web3-react,但我不知道如何在浏览器刷新时保持与 MetaMask 钱包的连接。

这是代码

// define the injectedConnectors

const injectedConnector = new InjectedConnector({
  supportedChainIds: [
    1,// Mainet
    3,// Ropsten
    4,// Rinkeby
    5,// Goerli
    42,// Kovan
  ],})

const { chainId,account,activate,active } = useWeb3React()
// activate the wallet
activate(injectedConnector)
console.log(account)
// all good. 

到这里一切正常,我激活了我的 MetaMask 钱包,并且我正确记录了帐户,并且活动变量是一个布尔值,它更改为 true。 问题是,当我刷新页面时,active 变为 false,并且我失去了 UI 与 MetaMask 钱包之间的连接。当然,将 active 保存到浏览器中不会改变任何东西,因为连接依赖于 active 布尔值。 文档缺少此类信息。 任何帮助将不胜感激。

解决方法

终于找到解决办法了! 我试图使用官方库中的示例 using ... 但由于某种原因它没有工作,尽管没有出现错误。 然后我偶然发现了一个有同样问题的人并在 reddit 上发帖,并得到了一个对我有用的好答案。 这是帖子的链接:https://www.reddit.com/r/ethdev/comments/nw7iyv/displaying_connected_wallet_after_browser_refresh/h5uxl88/?context=3 这是该帖子中的代码:

首先创建一个文件,其中包含名为 connector.js 的注入连接器:

import { InjectedConnector } from '@web3-react/injected-connector'
export const Injected = new InjectedConnector({ supportedNetworks: [1,3,4,5,42] })

然后创建一个组件来检查用户是否已经激活了钱包:

import React,{ useEffect,useState } from 'react'
import { injected } from '../connectors'
import { useWeb3React } from '@web3-react/core'

function MetamaskProvider({ children }) {
  const { active: networkActive,error: networkError,activate: activateNetwork } = useWeb3React()
  const [loaded,setLoaded] = useState(false)
  useEffect(() => {
    injected
      .isAuthorized()
      .then((isAuthorized) => {
        setLoaded(true)
        if (isAuthorized && !networkActive && !networkError) {
          activateNetwork(injected)
        }
      })
      .catch(() => {
        setLoaded(true)
      })
  },[activateNetwork,networkActive,networkError])
  if (loaded) {
    return children
  }
  return <>Loading</>
}

export default MetamaskProvider

并将 MetamaskProvider 包裹在您希望在刷新时激活钱包的组件:

 return (
    <ThemeProvider theme={darkMode ? darkTheme : lightTheme}>
      <StylesProvider injectFirst>
        <Paper>
          <Router>
            <Web3ReactProvider getLibrary={getLibrary}>
              <MetamaskProvider>
              {...children components}
              </MetamaskProvider>
            </Web3ReactProvider>
          </Router>
        </Paper>
      </StylesProvider>
    </ThemeProvider>
  );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?