Flutter中connectivity_plus结合GetX使用时,WiFi切换后GetX可观察对象未更新的问题
Flutter中connectivity_plus结合GetX使用时,WiFi切换后GetX可观察对象未更新的问题
这种情况我开发时也踩过同款坑!看你提供的main.dart代码,你只是完成了ConnectivityController的初始化,但核心问题应该是你的控制器内部压根没监听connectivity_plus的网络状态变化,也没实时更新GetX的可观察变量,所以切换WiFi后isConnected才会一直显示true。
我给你整理一套能解决问题的完整实现,你照着改就行:
首先,你的ConnectivityController得这么写,要把网络状态流和GetX的可观察变量绑定起来:
import 'package:get/get.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; class ConnectivityController extends GetxController { // 定义可观察的网络连接状态变量 final RxBool isConnected = true.obs; // 用于存储网络状态流的订阅,页面销毁时要取消,防止内存泄漏 StreamSubscription<ConnectivityResult>? _connectivitySubscription; @override void onInit() { super.onInit(); // 初始化时先获取一次当前的网络状态 _getInitialConnectivityStatus(); // 监听网络状态的实时变化 _connectivitySubscription = Connectivity().onConnectivityChanged.listen(_updateConnectionStatus); } // 获取初始网络状态 Future<void> _getInitialConnectivityStatus() async { final currentStatus = await Connectivity().checkConnectivity(); _updateConnectionStatus(currentStatus); } // 根据网络状态更新可观察变量 void _updateConnectionStatus(ConnectivityResult result) { // 这里要注意:connectivity_plus只是判断设备是否有网络连接,不是真正的"能上网"状态 // 如果要判断是否真的能访问互联网,还得额外加ping测试,先解决你当前的监听问题 isConnected.value = result != ConnectivityResult.none; print("当前网络连接状态:${isConnected.value}"); } @override void onClose() { // 页面销毁时必须取消订阅,避免内存泄漏 _connectivitySubscription?.cancel(); super.onClose(); } }
你的main.dart代码其实没啥问题,初始化顺序是对的,不过我再贴一遍确保你没改乱:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化全局控制器 Get.put(ConnectivityController()); runApp(const MyApp()); }
最后,你可以在任意页面里这样监听这个可观察变量,测试状态变化:
Obx(() { final connectivityCtrl = Get.find<ConnectivityController>(); return Text(connectivityCtrl.isConnected.value ? "当前已联网" : "当前无网络"); })
几个要注意的点:
- 必须在控制器的
onInit里监听onConnectivityChanged流,onClose里取消订阅,不然会有内存泄漏风险 ConnectivityResult.none代表设备完全没网络,但如果是连了WiFi但没网的情况,connectivity_plus还是会返回WiFi状态,要是需要判断真能上网,得额外加个ping逻辑- 初始化时一定要先调用
checkConnectivity拿初始状态,不然一开始的isConnected值可能和实际情况不符
改完之后你再切换WiFi试试,isConnected应该就能实时跟着变化了。
备注:内容来源于stack exchange,提问作者arslan
相关产品推荐
相关产品推荐

