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

获取可用WiFi列表时触发java.lang.IllegalStateException异常求助

问题原因与解决方案

核心异常原因分析

从你提供的Android栈日志和Dart代码来看,这个Reply already submitted异常的根源非常明确:你的Dart函数里存在重复返回逻辑,导致Flutter MethodChannel尝试向Native端提交多次回复。

先看你的Dart代码:

Future<List<WifiResult>> getAvailableWifi() async {
  List<WifiResult> filteredList = [];
  bool match = true;
  return Wifi.list(''); // 这里已经触发了一次MethodChannel调用回复
  List<WifiResult> wifis = await Wifi.list(''); // 这行代码永远不会执行,但关键是前面的return已经发起了回复
  return wifis;
}

你在函数里写了两个return语句:第一个return Wifi.list('');已经会让MethodChannel向Native端返回一个Future结果,相当于完成了一次调用回复;后续的代码虽然不会执行,但结合你说异常重复出现3次,大概率是这个错误的return逻辑+多次调用该函数,导致Native插件在处理时,试图重复提交回复,直接触发了IllegalStateException。

具体解决办法

1. 先修复Dart代码的低级逻辑错误

这是最紧急的一步,删掉冗余的return语句,保留正确的异步调用逻辑:

Future<List<WifiResult>> getAvailableWifi() async {
  // 移除无用的冗余变量(如果业务上不需要的话)
  // List<WifiResult> filteredList = [];
  // bool match = true;
  List<WifiResult> wifis = await Wifi.list('');
  return wifis;
}

这样函数只会发起一次Wifi.list('')调用,并且只返回一次结果,从根源上避免多次回复的问题。

2. 防止业务层的重复调用

如果你的UI场景中存在可能多次触发该函数的情况(比如用户快速点击按钮),建议添加调用防抖逻辑,确保同一时间只有一个WiFi列表请求在执行:

bool _isFetchingWifi = false;

Future<void> loadAvailableWifi() async {
  if (_isFetchingWifi) return; // 如果正在请求,直接返回
  _isFetchingWifi = true;
  try {
    List<WifiResult> wifis = await getAvailableWifi();
    // 这里处理获取到的WiFi列表
  } catch (e) {
    // 处理异常逻辑
    print("加载WiFi列表失败:$e");
  } finally {
    _isFetchingWifi = false; // 请求结束后重置标记
  }
}

这个逻辑可以避免短时间内多次调用Native插件,进一步防止重复回复的异常。

3. 插件层面的兜底优化(可选,如果你能修改Native插件代码)

如果你有权限修改WifiDelegate的代码,可以在getWifiList方法里添加状态判断,避免重复处理请求:

private boolean isRequestInProgress = false;

public void getWifiList(MethodCall call, Result result) {
    if (isRequestInProgress) {
        result.error("already_active", "WiFi列表请求正在进行中,请稍后再试", null);
        return;
    }
    isRequestInProgress = true;
    try {
        // 原有的获取WiFi列表逻辑
        // ...
        result.success(wifiListData);
    } catch (Exception e) {
        result.error("fetch_failed", e.getMessage(), null);
    } finally {
        isRequestInProgress = false;
    }
}

这样即使Dart端不小心发起了重复调用,Native插件也会友好返回错误,而不会抛出Reply already submitted的异常。

总结

优先修复Dart代码里的冗余return逻辑,再加上业务层的调用防抖,基本上就能解决这个异常问题。如果还有场景覆盖不到,再考虑Native插件的兜底优化。

内容的提问来源于stack exchange,提问作者Dhaval Kansara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:37:34