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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:39:24