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

Flutter应用全局持续检测网络连接并展示告警方案咨询

集中式全局网络状态检测与告警实现(Flutter)

实现思路

用connectivity_plus监听网络状态,通过全局Overlay实现跨页面的告警提示,无需在每个页面重复编码。核心是单例的网络状态管理器+全局Overlay的动态控制。

步骤1:添加依赖

在pubspec.yaml中引入依赖:

dependencies:
  flutter:
    sdk: flutter
  connectivity_plus: ^5.0.1 # 可替换为最新稳定版

执行flutter pub get完成依赖安装。

步骤2:创建全局网络状态管理器

新建单例类NetworkManager,负责监听网络状态并对外暴露状态流:

import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';

class NetworkManager {
  static final NetworkManager _instance = NetworkManager._internal();
  factory NetworkManager() => _instance;
  NetworkManager._internal();

  final Connectivity _connectivity = Connectivity();
  late StreamSubscription<ConnectivityResult> _subscription;
  final StreamController<bool> _networkStatusController = StreamController.broadcast();
  Stream<bool> get networkStatusStream => _networkStatusController.stream;

  bool _isOnline = true;
  bool get isOnline => _isOnline;

  // 初始化网络监听
  void init() async {
    // 获取初始网络状态
    final result = await _connectivity.checkConnectivity();
    _updateStatus(result);
    // 持续监听状态变化
    _subscription = _connectivity.onConnectivityChanged.listen(_updateStatus);
  }

  void _updateStatus(ConnectivityResult result) {
    final newStatus = result != ConnectivityResult.none;
    if (newStatus != _isOnline) {
      _isOnline = newStatus;
      _networkStatusController.add(newStatus);
    }
  }

  // 销毁监听资源
  void dispose() {
    _subscription.cancel();
    _networkStatusController.close();
  }
}

步骤3:在main中实现全局告警逻辑

在main.dart中初始化NetworkManager,通过Overlay动态添加/移除告警提示:

import 'package:flutter/material.dart';
import 'dart:async';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final NetworkManager _networkManager = NetworkManager();
  OverlayEntry? _overlayEntry;
  Timer? _dismissTimer;

  @override
  void initState() {
    super.initState();
    _networkManager.init();
    _listenToNetworkChanges();
  }

  void _listenToNetworkChanges() {
    _networkManager.networkStatusStream.listen((isOnline) {
      if (!isOnline) {
        // 网络断开,显示告警
        _showOfflineAlert();
      } else {
        // 网络恢复,显示提示并自动消失
        _showOnlineAlert();
      }
    });
  }

  void _showOfflineAlert() {
    _dismissTimer?.cancel();
    _overlayEntry?.remove();
    _overlayEntry = OverlayEntry(
      builder: (context) => Positioned(
        top: 0, // 改为bottom:0可切换到底部显示
        left: 0,
        right: 0,
        child: Material(
          color: Colors.red[700],
          child: const Padding(
            padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16),
            child: Text(
              "Internet is Disconnected",
              style: TextStyle(color: Colors.white, fontSize: 14),
              textAlign: TextAlign.center,
            ),
          ),
        ),
      ),
    );
    Overlay.of(context).insert(_overlayEntry!);
  }

  void _showOnlineAlert() {
    _overlayEntry?.remove();
    _overlayEntry = OverlayEntry(
      builder: (context) => Positioned(
        top: 0,
        left: 0,
        right: 0,
        child: Material(
          color: Colors.green[600],
          child: const Padding(
            padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16),
            child: Text(
              "Internet is Active",
              style: TextStyle(color: Colors.white, fontSize: 14),
              textAlign: TextAlign.center,
            ),
          ),
        ),
      ),
    );
    Overlay.of(context).insert(_overlayEntry!);
    // 3秒后自动隐藏提示
    _dismissTimer = Timer(const Duration(seconds: 3), () {
      _overlayEntry?.remove();
      _overlayEntry = null;
    });
  }

  @override
  void dispose() {
    _networkManager.dispose();
    _dismissTimer?.cancel();
    _overlayEntry?.remove();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Monitor Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const HomePage(),
    );
  }
}

// 示例主页
class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home')),
      body: const Center(child: Text('Main Content')),
    );
  }
}

关键说明

  • 单例管理器:确保整个APP只有一个网络监听实例,避免资源浪费
  • 全局Overlay:无需修改页面结构,直接在顶层添加提示条,所有页面都能看到
  • 自动消失逻辑:网络恢复后用Timer控制提示3秒后移除,不干扰用户操作
  • 状态防抖:NetworkManager中只在状态变化时发送事件,避免重复提示

可选优化

  • 给告警条添加滑入滑出动画提升视觉体验
  • 通过参数配置支持切换顶部/底部显示位置
  • 补充iOS/Android平台的权限声明(connectivity_plus在部分系统需要权限)

内容的提问来源于stack exchange,提问作者Shreyansh Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:27:29