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

如何在Flutter中实现类似Facebook Lite的断网提示及验证connectivity_plus能力

在Flutter中实现类似Facebook Lite的断网提示功能

一、实现断网提示的具体方案

要实现类似Facebook Lite的全局断网提示,核心是实时监听网络状态+验证实际连通性+全局提示组件,具体步骤如下:

1. 依赖准备

在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  connectivity_plus: ^4.0.0
  http: ^1.1.0

2. 网络状态管理类

封装一个单例类,同时监听硬件连接状态、验证实际互联网连通性:

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

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

  final Connectivity _connectivity = Connectivity();
  final StreamController<bool> _networkStatusController = StreamController.broadcast();

  Stream<bool> get networkStatusStream => _networkStatusController.stream;

  void init() {
    _connectivity.onConnectivityChanged.listen(_onConnectivityChanged);
    // 初始化时立即检测一次网络
    _checkActualConnection();
  }

  Future<void> _onConnectivityChanged(ConnectivityResult result) async {
    await _checkActualConnection();
  }

  // 验证是否有实际互联网访问能力
  Future<void> _checkActualConnection() async {
    bool hasValidInternet = false;
    try {
      // 请求一个稳定的公共接口验证连通性
      final response = await http.get(Uri.parse('https://www.baidu.com'));
      hasValidInternet = response.statusCode == 200;
    } catch (_) {
      hasValidInternet = false;
    }
    _networkStatusController.add(hasValidInternet);
  }

  void dispose() {
    _networkStatusController.close();
  }
}

3. 全局添加断网提示

在MaterialApp中通过状态监听,全局显示断网提示条:

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

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();
  bool _isOffline = false;

  @override
  void initState() {
    super.initState();
    _networkManager.init();
    _networkManager.networkStatusStream.listen((hasInternet) {
      setState(() {
        _isOffline = !hasInternet;
      });
    });
  }

  @override
  void dispose() {
    _networkManager.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('断网提示示例')),
        body: const Center(child: Text('应用主内容区域')),
        // 全局底部提示条
        persistentFooterButtons: _isOffline
            ? [
                Container(
                  width: double.infinity,
                  color: const Color(0xFFE53935),
                  padding: const EdgeInsets.symmetric(vertical: 10),
                  child: const Text(
                    '无网络连接,请检查你的网络设置',
                    textAlign: TextAlign.center,
                    style: TextStyle(color: Colors.white, fontSize: 14),
                  ),
                )
              ]
            : null,
      ),
    );
  }
}

二、关于connectivity_plus包的疑问

connectivity_plus只能检测设备是否连接到Wi-Fi/移动数据等硬件网络,无法判断是否有实际的互联网访问能力。比如连接了一个未联网的Wi-Fi热点,该包会返回"已连接"状态,但此时并没有可用网络。

因此必须结合实际的网络请求(如请求公共接口)来验证连通性,才能准确触发无网络提示,避免"假连接"的误判。

内容的提问来源于stack exchange,提问作者flutter 2022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:12:30