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

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客户端
  • 提前在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:54:19