Flutter DApp调用合约报错:不可同时指定loadChainIdFromNetwork与自定义链ID
问题解决:web3dart中fetchChainIdFromNetworkId引发的参数冲突错误
错误原因
错误提示You can't specify loadChainIdFromNetwork and specify a custom chain id!明确说明:调用sendTransaction时,不能同时启用fetchChainIdFromNetworkId(自动从网络获取chainId)和指定自定义chainId。你的代码中虽未在Transaction.callContract里显式设置chainId,但存在web3dart内部逻辑冲突或隐性chainId配置问题。
解决方案
方案一:手动指定chainId(推荐)
关闭自动获取chainId,根据你连接的Rinkeby测试网(chainId=4),在Transaction.callContract中显式指定chainId,同时移除fetchChainIdFromNetworkId参数:
修改Submit方法中的代码:
Future<String> Submit(String functionName, List<dynamic> args) async{ EthPrivateKey credentials = EthPrivateKey.fromHex("84a6fa216233a59b01c4a35acdf1501f0797130acf23f81420432d67d8805f59"); DeployedContract contract = await loadContract(); final ethFunction = contract.function(functionName); // 修改后的sendTransaction调用 final result = await ethClient.sendTransaction( credentials, Transaction.callContract( contract: contract, function: ethFunction, parameters: args, chainId: 4, // Rinkeby测试网的chainId ), ); return result; }
方案二:保留自动获取chainId
确保代码中没有任何地方(包括Transaction对象、合约配置)指定chainId,同时确认使用的web3dart版本支持该特性。不过此方法稳定性不如手动指定,网络获取chainId可能存在延迟或失败风险。
额外提示
你的代码中存在逻辑错误:按钮的存/提币逻辑与合约函数调用相反,需修正,同时建议操作后刷新余额:
// 存币方法(对应deposit按钮) Future<String> Sendcoin() async{ var bigAmount = BigInt.from(myAmount); var response = await Submit("depositBalance",[bigAmount]); print("存币完成"); await getBalance(myAdress); // 存币后刷新余额 return response; } // 提币方法(对应withdraw按钮) Future<String> Withdrawcoin() async{ var bigAmount = BigInt.from(myAmount); var response = await Submit("withdrawBalance",[bigAmount]); print("提币完成"); await getBalance(myAdress); // 提币后刷新余额 return response; }
内容的提问来源于stack exchange,提问作者Abhiram
相关产品推荐
相关产品推荐

