获取可用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

