Metamask

Metamask API:無法檢測 React.js 中的“連接”和“斷開”事件

  • November 15, 2021

您好,我對開發很陌生。

我正在通過 React.js 測試與 Metamask 的通信

我設法成功收聽網路和帳戶更改,但是當我嘗試檢測是否有人從我的應用程序“連接”或“斷開連接”時,我無法接收到該事件。

我正在使用的 Metamask API 文件: https ://docs.metamask.io/guide/ethereum-provider.html#connect

在職的:

  • ethereum.on('accountsChanged', handler: (accounts: Array<string>) => void);
  • ethereum.on('chainChanged', handler: (chainId: string) => void);

'

不工作:

  • ethereum.on('connect', handler: (connectInfo: ConnectInfo) => void);
  • ethereum.on('disconnect', handler: (error: ProviderRpcError) => void);

以下程式碼在我的 React.js 應用程序中完美執行(使用 React.Component)

 async checkAccountChange() {
  const ethereum = window.ethereum
  if (ethereum) {
    // Listening to Event
    ethereum.on('accountsChanged', accounts => {
      console.log(accounts[0])
      this.setState({ account: accounts[0] })
 })
}

}

另一方面,以下程式碼沒有給我任何控制台輸出

 async checkMetamaskHasConnected() {
   if (window.ethereum) {
     window.ethereum.on('connect', () => {
     console.log("Metamask connected")
     this.setState({ metamaskHasConnected: true })
 })
}

}

 async checkMetamaskHasDisconnected() {
   const ethereum = window.ethereum
     if (ethereum) {
     // Listening to Event
     ethereum.on('disconnect', () => {
       console.log("MetaMask discconnected")
       this.setState({ metamaskHasDisonnected: true })
 })
}

}

考慮到我是一個非常新鮮的初學者,只是邊做邊學

如果您的要求是:

檢測是否有人從我的應用程序“連接”或“斷開連接”

您嘗試的連接斷開連接方法可能無濟於事,因為它們旨在了解您與區塊鏈的連接是否可用(例如,當使用者已經連接嘗試啟動事務但 RPC 連接已關閉時)。

也許這篇文章可以幫助你。通過 和 的組合,getAccounts()currentProvider可以推斷使用者是否已連接。

否則,如果這只是為了了解使用者是否連接到您的網站,您可以使用 WebSockets(取決於您的架構)。

先生您好,您可以等待斷開連接時觸發事件(使用者從 Dapp 刪除 Metamask 中的連接),然後使用新地址發送操作如果目前有任何其他帳戶連接到 Dapp,否則您可以呼叫斷開功能

 const provider = await new web3(web3.givenProvider);
 provider.on('accountsChanged', (code: number, reason: string)=> {
     const accountSwitch = code[0];
                       if (accountSwitch){
                           if (accountSwitch) {
                               dispatch({
                                   type: _const.ADDRESS,
                                   payload: { address: accountSwitch }
                               })
                           }
                       }else{
                           DisconnectFromWallet();
                       }
                   });

引用自:https://ethereum.stackexchange.com/questions/93502