如何让Dart中订阅connectivity_plus流的方法每次状态更新都返回结果
问题根源
你原有代码的问题在于yield right(_result)仅会在初始检查网络状态时执行1次,嵌套在listen回调内的代码不在async*生成器的执行上下文内,无法触发新的yield动作,同时未取消的流订阅还会带来内存泄漏风险。
解决方案
使用await for遍历onConnectivityChanged流,即可在每次收到网络状态更新事件时触发yield,完整实现代码如下:
final Connectivity _connectivity = Connectivity(); Stream<Either<ValueFailure, ConnectivityResult>> watchConnectivity() async* { try { // 优先返回初始网络状态 final initialResult = await _connectivity.checkConnectivity(); yield right(initialResult); // 持续监听后续网络状态变更,自动随外层流取消订阅 await for (final newResult in _connectivity.onConnectivityChanged) { yield right(newResult); } } on PlatformException catch (e) { yield left(ValueFailure.connectivityError(failMessage: e.message ?? '未知网络连接异常')); } catch (e) { // 兜底捕获其他未知异常 yield left(ValueFailure.connectivityError(failMessage: e.toString())); } }
实现说明
- 无需额外维护全局的
_result变量,所有状态都可以在流事件回调中直接处理返回 - 当外部取消监听
watchConnectivity返回的流时,内部的onConnectivityChanged订阅会自动取消,无内存泄漏风险 - 异常捕获范围覆盖了初始状态检查和后续状态监听全流程,所有异常都能被正确捕获返回
- 注意:connectivity_plus返回的仅为网络连接类型,无法代表设备实际可访问公网,若需要判断真实联网能力,需额外增加可达性检测逻辑。
内容的提问来源于stack exchange,提问作者Syed Saad
相关产品推荐
相关产品推荐

