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

Flutter如何不使用provider库检测网络连接?

Flutter 无需Provider的网络连接检测方法

方法一:用connectivity_plus包实现实时网络监听

这个包能监听设备网络状态的实时变化,无需依赖Provider,直接通过Stream订阅状态变更。

  1. 添加依赖到pubspec.yaml:
dependencies:
  connectivity_plus: ^5.0.1
  1. 实现监听逻辑(以StatefulWidget为例):
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';

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

  @override
  State<NetworkCheckPage> createState() => _NetworkCheckPageState();
}

class _NetworkCheckPageState extends State<NetworkCheckPage> {
  late StreamSubscription<ConnectivityResult> _connectivitySubscription;
  String _networkStatus = '检测中...';

  @override
  void initState() {
    super.initState();
    // 初始化监听
    _connectivitySubscription = Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) {
      setState(() {
        switch (result) {
          case ConnectivityResult.wifi:
            _networkStatus = '当前连接WiFi';
            break;
          case ConnectivityResult.mobile:
            _networkStatus = '当前移动数据';
            break;
          case ConnectivityResult.none:
            _networkStatus = '无网络连接';
            break;
          default:
            _networkStatus = '未知网络状态';
        }
      });
    });
  }

  @override
  void dispose() {
    // 取消订阅,避免内存泄漏
    _connectivitySubscription.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('网络状态检测')),
      body: Center(child: Text(_networkStatus)),
    );
  }
}

方法二:通过dart:io手动检测网络连通性

如果不需要实时监听,只是在特定场景(比如发起请求前)主动验证网络是否可用,可以直接用dart内置的dart:io库,无需额外依赖。

示例代码:

import 'dart:io';

Future<bool> checkNetworkConnectivity() async {
  try {
    // 尝试连接公共域名,验证网络是否可达
    final result = await InternetAddress.lookup('google.com');
    return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
  } on SocketException catch (_) {
    return false;
  }
}

// 使用示例
void main() async {
  bool isConnected = await checkNetworkConnectivity();
  print(isConnected ? '网络可用' : '无网络');
}

方法三:结合StreamBuilder自动更新UI

把connectivity_plus的Stream和StreamBuilder结合,无需手动管理订阅和setState,直接在UI层响应网络状态变化:

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

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

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<ConnectivityResult>(
      stream: Connectivity().onConnectivityChanged,
      initialData: ConnectivityResult.none,
      builder: (context, snapshot) {
        String statusText;
        Color statusColor;

        switch (snapshot.data) {
          case ConnectivityResult.wifi:
            statusText = '已连接WiFi';
            statusColor = Colors.green;
            break;
          case ConnectivityResult.mobile:
            statusText = '已连接移动数据';
            statusColor = Colors.blue;
            break;
          case ConnectivityResult.none:
            statusText = '无网络连接';
            statusColor = Colors.red;
            break;
          default:
            statusText = '未知状态';
            statusColor = Colors.grey;
        }

        return Container(
          padding: const EdgeInsets.all(16),
          color: statusColor.withOpacity(0.1),
          child: Text(statusText, style: TextStyle(color: statusColor)),
        );
      },
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:15:52