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

如何在Flutter中根据网络连接状态显示带连接类型的Snackbar/Toast

Flutter 实现联网状态提示(Snackbar)

步骤1:添加依赖

在pubspec.yaml中引入connectivity_plus包,用于监听设备网络状态:

dependencies:
  flutter:
    sdk: flutter
  connectivity_plus: ^5.0.1 # 建议使用最新版本

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

步骤2:实现网络监听与Snackbar提示

创建一个StatefulWidget,在初始化阶段启动网络监听,根据状态变化展示对应风格的Snackbar:

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

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

  @override
  State<NetworkStatusSnackbar> createState() => _NetworkStatusSnackbarState();
}

class _NetworkStatusSnackbarState extends State<NetworkStatusSnackbar> {
  late Connectivity _connectivity;
  late StreamSubscription<ConnectivityResult> _subscription;

  @override
  void initState() {
    super.initState();
    _connectivity = Connectivity();
    // 初始检查网络状态
    _checkInitialStatus();
    // 监听网络状态变化
    _subscription = _connectivity.onConnectivityChanged.listen(_handleStatusChange);
  }

  Future<void> _checkInitialStatus() async {
    final status = await _connectivity.checkConnectivity();
    _showSnackbar(status);
  }

  void _handleStatusChange(ConnectivityResult status) {
    _showSnackbar(status);
  }

  void _showSnackbar(ConnectivityResult status) {
    // 清除之前的Snackbar,避免叠加
    ScaffoldMessenger.of(context).clearSnackBars();

    String message;
    Color bgColor;

    if (status == ConnectivityResult.none) {
      message = "网络已断开";
      bgColor = Colors.red;
    } else {
      final type = _getConnectionText(status);
      message = "已连接到$type";
      bgColor = Colors.green;
    }

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(message),
        backgroundColor: bgColor,
        duration: const Duration(seconds: 3),
      ),
    );
  }

  String _getConnectionText(ConnectivityResult status) {
    switch (status) {
      case ConnectivityResult.wifi:
        return "WiFi网络";
      case ConnectivityResult.mobile:
        return "蜂窝网络";
      case ConnectivityResult.ethernet:
        return "以太网";
      case ConnectivityResult.bluetooth:
        return "蓝牙网络";
      default:
        return "网络";
    }
  }

  @override
  void dispose() {
    _subscription.cancel(); // 取消监听,防止内存泄漏
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(
        child: Text("网络状态变化时自动弹出提示"),
      ),
    );
  }
}

步骤3:配置Android权限

在android/app/src/main/AndroidManifest.xml中添加网络状态权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

iOS无需额外配置权限。

额外说明

  • connectivity_plus仅判断设备是否连接网络,无法验证网络是否可访问(如WiFi已连接但无互联网),若需验证可用性,可结合dart:io的InternetAddress进行ping测试。
  • 可根据需求调整Snackbar的duration,设置为Duration.infinite可让提示保持到用户手动关闭。
  • 多页面应用中,可将网络监听逻辑封装到全局状态管理(如Provider、GetX)中,实现全局提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:40:29