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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:25:24