Web3js

如何檢測 Metamask 中的帳戶更改?

  • December 30, 2021

當使用者在 metamask 中更改為不同的帳戶時,有沒有辦法在程式碼中非同步檢測它?

我目前使用

this.web3.eth.getAccounts((err, accs) => {   
 this.account = accs[0];
});  

但是當帳戶更改時,它仍然會拿起以前的帳戶。刷新頁面不是一種方法。有沒有人面對這個並有解決方案?

正如Metamask FAQs所建議的,這可能是一個選項:

var account = web3.eth.accounts[0];
var accountInterval = setInterval(function() {
 if (web3.eth.accounts[0] !== account) {
   account = web3.eth.accounts[0];
   updateInterface();
 }
}, 100);

編輯

在較新的版本中,元遮罩暴露了一個事件,該事件可用於根據新文件檢測是否存在帳戶更改:

window.ethereum.on('accountsChanged', function (accounts) {
 // Time to reload your interface with accounts[0]!
})

來自MetaMask 文件

window.ethereum.on('accountsChanged', function (accounts) {
 // Time to reload your interface with accounts[0]!
})

window.ethereum.on('networkChanged', function (networkId) {
 // Time to reload your interface with the new networkId
})

正如@Sr.PEDRO所指出ethereum.publicConfigStore的那樣,將來不會起作用。事實上,它將被完全刪除。有關詳細資訊,請參閱此 GitHub 評論

您還可以阻止 MetaMask 自動重新載入網頁:

window.onbeforeunload = function() {
 return "Prevent reload"
}

這僅適用於您使用window.web3MetaMask 注入的對象,該對像也計劃被刪除

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