Flutter如何不使用provider库检测网络连接?
Flutter 无需Provider的网络连接检测方法
方法一:用connectivity_plus包实现实时网络监听
这个包能监听设备网络状态的实时变化,无需依赖Provider,直接通过Stream订阅状态变更。
- 添加依赖到
pubspec.yaml:
dependencies: connectivity_plus: ^5.0.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
相关产品推荐
相关产品推荐

