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

Next JS中带查询参数时Wagmi useSigner Hook失效问题

解决NextJS中Wagmi useSigner带查询参数路由返回null的问题

问题根源

带查询参数的路由会触发NextJS页面重新渲染,但Wagmi的签名器状态未及时同步——要么是路由变化时钱包会话恢复延迟,要么是Wagmi配置未正确适配NextJS的路由逻辑。

具体解决步骤

1. 修正Wagmi客户端的路由配置

在_app.tsx中,必须使用Wagmi的Next路由适配器,同时开启自动连接确保页面加载时恢复钱包会话:

import { WagmiConfig, createConfig, configureChains } from 'wagmi';
import { mainnet, polygon } from 'wagmi/chains';
import { publicProvider } from 'wagmi/providers/public';
import { connectorsForWallets } from '@rainbow-me/rainbowkit';
import { rainbowWallet, metaMaskWallet } from '@rainbow-me/rainbowkit/wallets';
import { NextRouterAdapter } from 'wagmi/adapters/next-router';

const { chains, publicClient, webSocketPublicClient } = configureChains(
  [mainnet, polygon],
  [publicProvider()]
);

const connectors = connectorsForWallets([
  {
    groupName: '常用钱包',
    wallets: [rainbowWallet({ chains }), metaMaskWallet({ chains })],
  },
]);

const config = createConfig({
  autoConnect: true, // 关键:开启自动恢复钱包连接会话
  connectors,
  publicClient,
  webSocketPublicClient,
  router: new NextRouterAdapter(), // 适配NextJS路由变化
});

2. 优化页面中useSigner的使用逻辑

不要仅监听路由参数,需结合Wagmi的useAccount状态,等钱包确认连接后再获取签名器:

import { useSigner, useAccount } from 'wagmi';
import { useEffect, useState } from 'react';

export default function Home() {
  const { isConnected } = useAccount();
  const { data: signer } = useSigner();
  const [currentSigner, setCurrentSigner] = useState(signer);

  useEffect(() => {
    // 钱包已连接且签名器存在时更新状态
    if (isConnected && signer) {
      setCurrentSigner(signer);
    }
  }, [isConnected, signer]);

  return (
    <div>
      <h1>签名器状态</h1>
      {isConnected ? (
        <p>签名器:{currentSigner ? '已加载' : '加载中...'}</p>
      ) : (
        <p>请连接你的钱包</p>
      )}
      {/* 放置Rainbow Kit连接按钮 */}
    </div>
  );
}

3. 检查Rainbow Kit的Provider包裹顺序

确保RainbowKitProvider嵌套在WagmiConfig内部,且正确传入chains参数:

import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
import '@rainbow-me/rainbowkit/styles.css';

function MyApp({ Component, pageProps }) {
  return (
    <WagmiConfig config={config}>
      <RainbowKitProvider chains={chains}>
        <Component {...pageProps} />
      </RainbowKitProvider>
    </WagmiConfig>
  );
}

export default MyApp;

4. 临时排查:禁用页面静态优化

若上述方案无效,可给页面添加getServerSideProps,强制每次请求都初始化页面状态:

export const getServerSideProps = async () => {
  return { props: {} };
};

核心要点

  • autoConnect: true是恢复钱包会话的核心,带查询参数的路由易出现会话恢复延迟,必须通过Next路由适配器让Wagmi感知路由变化。
  • 不要单独依赖路由参数监听,要以钱包连接状态(isConnected)为判断标准,确保签名器加载完成后再执行后续操作。

内容的提问来源于stack exchange,提问作者Suhel Kapadia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:25