Flutter错误:‘void Function(ConnectivityResult)’无法赋值给目标类型如何解决?
解决Flutter中Connectivity回调参数类型不匹配问题
错误原因
你遇到的错误是因为connectivity(或connectivity_plus)包版本更新后,onConnectivityChanged流的输出类型从单个ConnectivityResult改为List<ConnectivityResult>,但你的_updateConnectionStatus方法仍接收单个ConnectivityResult参数,导致类型不兼容。另外代码存在变量不一致问题:initState里赋值的是subscription,但dispose里取消的是connectivitySubscription,会导致订阅无法正确取消。
修复方案
- 修改
_updateConnectionStatus方法的参数为List<ConnectivityResult>,从列表中获取当前连接状态(普通场景取第一个元素即可) - 修正订阅变量的赋值逻辑,确保
dispose时能正确取消订阅 - 统一变量类型,避免隐式类型转换问题
修改后的完整代码
late StreamSubscription<List<ConnectivityResult>> subscription; StreamSubscription<ConnectivityResult>? connectivitySubscription; StreamSubscription? internetSubscription; bool hasInternet = false; @override void initState(){ super.initState(); subscription = Connectivity().onConnectivityChanged.listen(_updateConnectionStatus); internetSubscription = InternetConnectionChecker().onStatusChange.listen((status) { final hasInternet = status == InternetConnectionStatus.connected; setState(() => this.hasInternet = hasInternet); }); } @override void dispose() { subscription.cancel(); internetSubscription?.cancel(); super.dispose(); } void _updateConnectionStatus (List<ConnectivityResult> results) { final result = results.first; final hasInternet = result != ConnectivityResult.none; final message = hasInternet ? result == ConnectivityResult.mobile ? '你已连接到移动网络' : '你已连接到无线网络' : '当前无网络连接'; if (!hasInternet) { Get.rawSnackbar( messageText: Text('请连接网络:$message', style: const TextStyle(color: Colors.white, fontSize: 14)), isDismissible: false, duration: const Duration(days: 1), backgroundColor: Colors.red[400]!, icon: const Icon( Icons.wifi_off, color: Colors.white, size: 35, ), snackStyle: SnackStyle.GROUNDED); } else { if (Get.isSnackbarOpen) { Get.closeCurrentSnackbar(); } } }
额外说明
- 若使用
connectivity_plus包,该类型变更从2.0.0版本左右开始生效,流输出改为多连接状态列表 - 如需处理多连接场景,可遍历
results列表判断所有连接状态,普通业务场景取第一个元素即可
内容的提问来源于stack exchange,提问作者jo4s3ph shaman
相关产品推荐
相关产品推荐

