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

Flutter实现全局统一显示网络连接状态提示容器方案

Flutter全局网络状态提示(无重复编码方案)

问题背景

当前使用internet_connection_checker包实现网络状态提示,但需要在每个页面重复编写监听逻辑和UI代码,希望实现全局统一的提示,无需页面级重复编码。


全局解决方案实现步骤

1. 封装全局网络状态服务(单例)

创建单例服务统一管理网络状态流,避免重复初始化监听:

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

class NetworkService {
  // 单例实现
  static final NetworkService _instance = NetworkService._internal();
  factory NetworkService() => _instance;
  NetworkService._internal();

  final _internetStatusController = StreamController<bool>.broadcast();
  // 对外暴露网络状态流
  Stream<bool> get internetStatusStream => _internetStatusController.stream;

  // 初始化网络监听
  void init() {
    InternetConnectionChecker().onStatusChange.listen((status) {
      final hasInternet = status == InternetConnectionStatus.connected;
      _internetStatusController.add(hasInternet);
    });
  }

  // 销毁流,避免内存泄漏
  void dispose() {
    _internetStatusController.close();
  }
}

2. 实现全局网络提示Widget

创建一个包裹性Widget,自动根据网络状态显示/隐藏提示栏:

import 'package:flutter/material.dart';
import 'package:your_app_name/network_service.dart'; // 替换为你的服务路径

class NetworkStatusBar extends StatelessWidget {
  final Widget child;
  const NetworkStatusBar({super.key, required this.child});

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<bool>(
      stream: NetworkService().internetStatusStream,
      initialData: true, // 默认假设有网,可根据需求调整
      builder: (context, snapshot) {
        final hasInternet = snapshot.data ?? true;
        return Column(
          children: [
            // 仅无网时显示提示栏
            if (!hasInternet)
              Container(
                color: const Color(0xFFE53935), // 警告红色
                padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 3),
                height: 25,
                width: double.infinity,
                child: const Center(
                  child: Text(
                    "无网络连接",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 15,
                      fontWeight: FontWeight.w400,
                    ),
                  ),
                ),
              ),
            // 承载页面内容
            Expanded(child: child),
          ],
        );
      },
    );
  }
}

3. 在入口处全局包裹应用

在main.dart中初始化网络服务,并将NetworkStatusBar作为所有页面的父容器:

import 'package:flutter/material.dart';
import 'package:your_app_name/network_service.dart';
import 'package:your_app_name/network_status_bar.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化全局网络服务
  NetworkService().init();
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App',
      theme: ThemeData(primarySwatch: Colors.blue),
      // 用NetworkStatusBar包裹首页,所有子页面都会继承提示栏
      home: NetworkStatusBar(
        child: const HomePage(), // 替换为你的首页
      ),
    );
  }
}

方案优势

  • 无重复编码:所有页面自动继承网络提示,无需在每个页面编写监听和UI代码
  • 全局统一管理:网络状态流全局唯一,避免多页面重复监听网络
  • 自动响应状态变化:StreamBuilder自动监听流更新,无需手动调用setState
  • 低侵入性:不影响原有页面结构,仅通过包裹实现功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:55:30