Flutter internet_connection_checker网络重连提示触发逻辑问题
问题原因
internet_connection_checker 包的 onStatusChange 流在首次被订阅时,会立即推送当前设备的网络状态作为第一个事件,因此应用启动完成开始监听时,如果设备已经处于联网状态,会直接触发联网成功的弹窗逻辑。
修复思路
- 增加初始状态标记位,直接跳过订阅后第一次返回的初始网络状态,不触发任何提示
- 仅在后续网络状态发生变更时响应逻辑:
- 从联网切换到断网时,弹出断网提示
- 从断网切换到联网时,弹出重连成功提示
- 补全流订阅的取消逻辑,避免内存泄漏
修改后完整代码
import 'dart:async'; import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:flutter/material.dart'; class CheckingConnectivity { late InternetConnectionChecker internetConnectionChecker; StreamSubscription<InternetConnectionStatus>? connectionStatusListener; bool hasInternetConnection = false; // 初始状态标记,用于跳过首次监听时的初始状态回调 bool _isInitialStatus = true; final onStatusChange = InternetConnectionChecker().onStatusChange; // 启动网络状态监听 void internetChecker(BuildContext context) { connectionStatusListener = onStatusChange.listen((event) async { final newIsConnected = event == InternetConnectionStatus.connected; // 首次回调只同步初始网络状态,不弹出任何提示 if (_isInitialStatus) { hasInternetConnection = newIsConnected; _isInitialStatus = false; return; } // 仅当网络状态发生实际变化时触发提示 if (newIsConnected != hasInternetConnection) { hasInternetConnection = newIsConnected; if (hasInternetConnection) { // 仅从断网切到联网时,弹出连接成功提示 showSnackBar(context, "Connected"); } else { // 切到断网时弹出断网提示 showSnackBar(context, "Disconnected"); } } }); } // 在页面/应用销毁时调用,取消监听防止内存泄漏 void dispose() { connectionStatusListener?.cancel(); } void showSnackBar(BuildContext context, String message) { final snackBar = SnackBar( content: Text( message, style: const TextStyle(color: Colors.white, backgroundColor: Colors.grey), ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } }
使用注意
- 在初始化网络监听的对应组件的
dispose生命周期中,调用CheckingConnectivity实例的dispose()方法取消流订阅 - 初始启动时无论设备是否联网,都不会弹出任何提示,只有后续网络状态发生切换时才会触发对应提示,完全符合预期需求
内容的提问来源于stack exchange,提问作者alt
相关产品推荐
相关产品推荐

