Android中WalletConnect Deeplink无法在Flutter应用内跳转指定页面
解决方案:解析WalletConnect Deeplink 实现GetX路由跳转
针对你遇到的问题,核心思路是解析wc:协议链接的参数,再根据业务逻辑触发GetX路由跳转,具体步骤如下:
1. 解析WalletConnect链接内容
Flutter的Uri类可以直接解析非HTTP协议的链接,提取其中的会话信息和查询参数:
// 示例链接,实际可替换为唤起时获取的deeplink内容 final wcLink = 'wc:35f76b10-19b5-4d16-8d2f-ac5d430be5e9@1?bridge=https%3A%2F%2F4.bridge.walletconnect.org&key=fc9f29c26cc97ad2c476f2f9ba953709d45db540aa1826cb62d3352d3f80bcaa'; final wcUri = Uri.parse(wcLink); // 提取会话ID和版本号 final sessionParts = wcUri.path.split('@'); final sessionId = sessionParts[0]; // 35f76b10-19b5-4d16-8d2f-ac5d430be5e9 final version = sessionParts[1]; // 1 // 提取bridge和key参数 final bridge = wcUri.queryParameters['bridge']; final key = wcUri.queryParameters['key'];
2. 触发GetX路由跳转
解析完成后,直接调用GetX的路由方法,将参数传递给目标页面:
// 假设钱包连接页面的路由名称为 '/wallet-connect' Get.toNamed('/wallet-connect', arguments: { 'sessionId': sessionId, 'version': version, 'bridge': bridge, 'key': key, });
3. 在目标页面接收参数
在跳转后的页面中,通过GetX获取传递的参数,用于初始化WalletConnect会话:
class WalletConnectPage extends StatelessWidget { const WalletConnectPage({super.key}); @override Widget build(BuildContext context) { // 获取路由参数 final args = Get.arguments as Map<String, dynamic>; final sessionId = args['sessionId']; final bridge = args['bridge']; // 后续可使用这些参数初始化WalletConnect连接 return Scaffold( appBar: AppBar(title: const Text('钱包连接')), body: Center(child: Text('会话ID: $sessionId')), ); } }
4. 处理Deeplink唤起逻辑
确保项目已配置wc:协议的deeplink(Android修改AndroidManifest.xml,iOS修改Info.plist),然后在入口处处理冷/热启动的唤起事件:
void main() { runApp(const MyApp()); // 处理冷启动时的deeplink WidgetsBinding.instance.addPostFrameCallback((_) { handleDeeplink(); }); } // 统一处理deeplink的方法 void handleDeeplink() async { // 依赖uni_links包获取deeplink,需在pubspec.yaml中添加依赖 final initialLink = await getInitialLink(); if (initialLink != null) { parseAndNavigate(initialLink); } // 监听热启动时的deeplink linkStream.listen((link) { if (link != null) { parseAndNavigate(link); } }); } // 解析并跳转 void parseAndNavigate(String link) { if (link.startsWith('wc:')) { final wcUri = Uri.parse(link); final sessionParts = wcUri.path.split('@'); final sessionId = sessionParts[0]; final version = sessionParts[1]; final bridge = wcUri.queryParameters['bridge']; final key = wcUri.queryParameters['key']; Get.toNamed('/wallet-connect', arguments: { 'sessionId': sessionId, 'version': version, 'bridge': bridge, 'key': key, }); } }
需要添加的依赖(pubspec.yaml):
dependencies: uni_links: ^0.5.1 get: ^4.6.5
内容的提问来源于stack exchange,提问作者Hadi Norouzi
相关产品推荐
相关产品推荐

