Flutter集成Magic认证对接Solana时获取到以太坊地址如何解决
问题根因
获取到以太坊格式地址是两个配置错误导致的:
- 自定义Magic实例时传入的
chainId: 1是以太坊主网的EVM链ID,SDK会默认按EVM规则生成地址,不会识别Solana RPC配置 - 直接读取
metadata.publicAddress的逻辑默认返回EVM生态地址,Solana属于非EVM链,无法通过通用用户元数据接口返回对应格式地址。
修复步骤
1. 补全依赖、修正初始化逻辑
首先在pubspec.yaml中引入Magic官方的Solana扩展模块,不要只使用基础magic-sdk包。
初始化实例时删除错误的EVM chainId参数,正确代码如下:
import 'package:magic_sdk/magic_sdk.dart'; import 'package:magic_sdk/modules/blockchain/solana.dart'; // 应用启动阶段初始化Magic实例 Magic.instance = Magic.custom( MY_API_KEY, rpcUrl: "https://api.testnet.solana.com", // 移除原代码中chainId: 1的配置,Solana不使用EVM链ID规则 );
2. 替换地址获取逻辑
不要从getMetadata()返回结果中取地址,调用Solana模块的专属接口获取Solana格式地址:
final _magic = Magic.instance; // 先走原有登录逻辑,登录成功后再获取地址 await _magic.auth.loginWithEmailOTP(email: 'your_user_email@example.com'); // 通过Solana模块获取链上地址 final accounts = await _magic.solana.getAccounts(); final solanaPublicAddress = accounts.first;
3. 异常排查项
- 登录Magic控制台,确认当前使用的API Key对应的应用已开启Solana测试网权限,未开链权限时前端配置正确也无法返回正常地址
- 如果之前登录过并缓存了旧的EVM地址,先执行
await _magic.user.logout()清除本地登录缓存,重新触发登录流程后再取地址 - 不要混用EVM相关的方法调用Solana链能力,所有Solana链交互都走
_magic.solana模块下的方法。
内容的提问来源于stack exchange,提问作者Samay Gandhi
相关产品推荐
相关产品推荐

