Flutter开发Flow公链dApp时如何连接Blocto钱包?
Flutter 接入 Flow 链 Blocto 钱包实现方案
前置准备
- 在
pubspec.yaml中添加所需依赖:flow_sdk:Flow官方Dart SDK,负责链上数据编码、交易状态查询等基础能力blocto_flutter_sdk:Blocto官方Flutter SDK,封装了钱包连接、授权签名的全流程url_launcher:用于处理移动端跳转钱包、授权页回跳的链路
- 完成端侧配置:
- Android端在
AndroidManifest.xml中添加对应intent filter,配置Blocto回跳scheme,格式为blocto[你申请的appId] - iOS端在
Info.plist的LSApplicationQueriesSchemes中添加blocto、blocto-dev项,允许跳转Blocto客户端
- Android端在
- 提前在Blocto开发者平台注册你的dApp,获取对应网络(测试网/主网)的appId,两个网络的appId不通用,不要混用。
核心功能实现
1. SDK初始化
全局初始化建议放在main.dart的runApp方法前执行,避免后续调用出现未初始化错误:
import 'package:blocto_flutter_sdk/blocto_flutter_sdk.dart'; import 'package:flow_sdk/flow_sdk.dart'; void initWalletSDK() { BloctoSDK.init( appId: "替换为你申请到的Blocto appId", // 测试网环境传FlowNetwork.testnet,主网环境替换为FlowNetwork.mainnet network: FlowNetwork.testnet, ); }
2. 连接钱包获取用户地址
调用连接方法后会自动拉起Blocto钱包(未安装客户端时会自动跳转网页授权页),用户完成授权后即可拿到链上地址:
Future<String?> connectAndGetAddress() async { try { final accountRes = await BloctoSDK.flow.requestAccount(); // accountRes.address 就是用户的Flow链地址,可存入本地状态管理 final userAddress = accountRes.address; return userAddress; } catch (e) { // 统一处理用户拒绝授权、网络异常、回跳失败等错误 print("钱包连接异常: $e"); return null; } }
3. 交易授权与发送
构造完Cadence交易脚本和参数后,调用SDK方法即可唤起Blocto完成签名授权,用户确认后SDK会自动将签名后的交易广播到链上,返回交易ID:
/// 示例:发送Flow转账交易 Future<String?> sendTransferTx(String senderAddr, String receiverAddr, double transferAmount) async { try { // Cadence交易脚本,注意不同网络下的系统合约地址要对应修改 const transferScript = ''' import FungibleToken from 0x9a0766d93b6608b7 import FlowToken from 0x7e60df042a9c0868 transaction(amount: UFix64, receiver: Address) { let vault: @FungibleToken.Vault prepare(signer: AuthAccount) { let flowVault = signer.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault) ?? panic("无法加载用户Flow资产账户") self.vault <- flowVault.withdraw(amount: amount) } execute { let receiverAcct = getAccount(receiver) let receiverCap = receiverAcct.getCapability(/public/flowTokenReceiver) .borrow<&{FungibleToken.Receiver}>() ?? panic("收款地址不支持接收Flow") receiverCap.deposit(from: <-self.vault) } } '''; // 按脚本参数顺序构造编码参数 final txArgs = [ UFix64Value(transferAmount.toStringAsFixed(8)), AddressValue(receiverAddr), ]; // 唤起Blocto授权 final txId = await BloctoSDK.flow.sendTransaction( script: transferScript, arguments: txArgs, // 普通用户发起的交易,proposer、payer、authorizer一般都是用户自己的地址 proposerAddress: senderAddr, payerAddress: senderAddr, authorizers: [senderAddr], ); // 拿到txId后可调用flow_sdk的查询接口轮询交易上链状态 return txId; } catch (e) { print("交易发起失败: $e"); return null; } }
注意事项
- 测试网调试前先给测试地址领测试网Flow作为gas,否则交易会因为余额不足失败
- Cadence脚本中引用的合约地址必须和当前网络匹配,测试网、主网的公共合约地址存在差异,不要硬编码错误地址
- 拿到交易ID不要直接判定交易成功,要通过Flow SDK轮询直到交易状态为
sealed,再给用户展示成功结果 - 安卓端必须正确配置回跳scheme,否则用户授权后无法自动返回你的应用
- 如果需要调用自定义合约,提前在Blocto后台配置合约地址信息,否则可能出现签名校验失败的问题
内容的提问来源于stack exchange,提问作者mr.SoSerious
相关产品推荐
相关产品推荐

