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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:44:51