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

如何实现Phantom钱包与Flutter Web应用的对接?解决无pub.dev包及dart-js interop使用困境

解决方案:通过dart:js interop对接Phantom钱包(Flutter Web)

我之前在Flutter Web项目里对接Phantom钱包时也踩过类似的坑,pub.dev确实还没有成熟的官方/第三方包,但用dart:js和dart:js_util完全可以实现对接,大概率是你之前的interop写法有细节没处理对。下面是我验证可行的步骤和代码:

1. 基础依赖导入

首先不需要额外安装pub包,直接用Flutter自带的dart:js工具类:

import 'dart:js';
import 'dart:js_util' as js_util;

2. 检查Phantom钱包是否已安装

先判断用户浏览器里有没有Phantom钱包,同时确认是Phantom(避免和其他Solana钱包冲突):

bool isPhantomInstalled() {
  final solana = context['solana'];
  if (solana == null) return false;
  // Phantom钱包会暴露专属的isPhantom属性
  return js_util.getProperty(solana, 'isPhantom') as bool? ?? false;
}

3. 请求连接钱包

Phantom的连接调用是异步JS Promise,需要用js_util.promiseToFuture转换为Dart的Future来处理:

Future<String?> connectPhantom() async {
  if (!isPhantomInstalled()) {
    print('Phantom钱包未安装,请先安装');
    return null;
  }
  
  try {
    final solana = context['solana'];
    // 调用Phantom的connect方法,返回包含用户公钥的对象
    final result = await js_util.promiseToFuture(js_util.callMethod(solana, 'connect', []));
    // 提取公钥字符串
    final publicKey = js_util.getProperty(result, 'publicKey') as String;
    return publicKey;
  } catch (e) {
    print('连接失败:${e.toString()}');
    return null;
  }
}

4. 监听钱包断开事件

如果用户手动在Phantom里断开连接,你可以通过监听事件及时更新UI:

void setupDisconnectListener(Function() onDisconnect) {
  final solana = context['solana'];
  if (solana == null) return;
  
  // 注册disconnect事件监听
  js_util.callMethod(solana, 'on', ['disconnect', allowInterop(() {
    onDisconnect();
  })]);
}

关键注意事项

  • 必须在Flutter Web环境下测试:这些代码依赖浏览器的window对象,在桌面/移动模拟器里运行会直接报错。
  • 处理用户拒绝连接的场景:上面的catch块会捕获用户点击"拒绝"的错误,你可以在UI上给出友好提示。
  • 扩展复杂操作:如果需要签名交易、发送指令等,逻辑和连接一致——调用solana对象的对应JS方法,再用promiseToFuture处理异步即可。

我用这套逻辑在多个Flutter Web项目里成功对接了Phantom,你可以调整代码试试,应该能解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:47:31