如何使用Flutter与ERC721智能合约交互实现NFT铸造功能?
Flutter实现ERC721合约交互完全可行,不需要切换React技术栈
你有丰富的Flutter开发经验可以直接沿用现有技术栈完成NFT铸造Dapp的开发,具体实现路径如下:
核心依赖选择
web3dart:Flutter生态最成熟的EVM链交互SDK,原生支持合约调用、交易签名、链上数据查询,完全兼容ERC721全量标准接口walletconnect_flutter_v2:跨端对接MetaMask等主流加密钱包的依赖,支持用户通过自有钱包签名交易,无需在应用内托管用户私钥,安全性更高flutter_web3:如果需要发布Web端Dapp,可以用这个依赖直接对接浏览器插件钱包,适配Web端的钱包连接逻辑
核心实现步骤
- 准备对接的ERC721合约ABI文件,仅保留你需要用到的方法(如
safeMint、balanceOf、tokenURI等)即可,将ABI文件存为项目的静态资源 - 初始化Web3客户端与合约实例,参考代码如下:
import 'package:web3dart/web3dart.dart'; import 'package:http/http.dart' as http; import 'package:flutter/services.dart'; // 初始化RPC客户端,rpcUrl替换为对应链的RPC节点地址 final web3Client = Web3Client('你的RPC节点地址', http.Client()); // 加载合约ABI final erc721Abi = await rootBundle.loadString('assets/erc721_abi.json'); // 初始化合约实例,contractAddress替换为你的ERC721合约链上地址 final erc721Contract = DeployedContract( ContractAbi.fromJson(erc721Abi, '自定义ERC721合约名'), EthereumAddress.fromHex('你的ERC721合约地址'), );
- 调用只读方法不需要用户签名,直接调用即可,比如查询用户持有的NFT数量:
final balanceOfFunc = erc721Contract.function('balanceOf'); final result = await web3Client.call( contract: erc721Contract, function: balanceOfFunc, params: [EthereumAddress.fromHex('用户钱包地址')], ); int userNftCount = result.first.toInt();
- 调用写方法(比如铸造NFT)需要用户签名交易,通过WalletConnect获取用户钱包授权后,构造交易参数传给钱包签名,再上链发送即可,参考代码如下:
final safeMintFunc = erc721Contract.function('safeMint'); final mintTx = Transaction.callContract( contract: erc721Contract, function: safeMintFunc, // 参数顺序要和合约里safeMint方法的参数顺序完全一致 parameters: [EthereumAddress.fromHex('接收NFT的用户地址'), '你的NFT元数据URI'], maxGas: 250000, // 按照你合约的实际gas消耗调整 ); // 用授权后的钱包签名并发送交易,txHash即为上链后的交易哈希 String txHash = await web3Client.sendTransaction( walletCredentials, // 从WalletConnect获取的用户签名凭证 mintTx, chainId: 你对接的链ID, // 比如以太坊主网是1,Polygon主网是137 );
注意事项
- 不要在应用内存储用户私钥,所有需要签名的操作都优先通过WalletConnect对接第三方钱包完成,避免安全风险
- 不同链的RPC配置、链ID、gas费规则需要对应准确,否则会出现交易发送失败的问题
- 同时发布移动端和Web端的话,注意区分两端的钱包适配逻辑,
web3dart支持全端调用,flutter_web3仅适配Web端场景
内容的提问来源于stack exchange,提问作者Rizvi Haider
相关产品推荐
相关产品推荐

