Flutter中如何通过Dio拦截器与connectivity包实现请求前网络检测
Flutter 请求前网络检查实现(Dio拦截器 + Connectivity包)
直接上落地方案,分步骤实现:
1. 安装依赖
先在pubspec.yaml中添加所需包:
dependencies: flutter: sdk: flutter dio: ^5.4.0 # 用最新稳定版即可 connectivity_plus: ^5.0.1 # 官方推荐替代原connectivity包,支持更多平台
执行flutter pub get完成安装。
2. 封装网络状态检查工具
写个轻量工具类统一处理网络状态判断:
import 'package:connectivity_plus/connectivity_plus.dart'; class NetworkChecker { // 检查设备是否有可用网络连接 static Future<bool> isConnected() async { final result = await Connectivity().checkConnectivity(); // 只要不是无网络状态,就判定为有可用连接 return result != ConnectivityResult.none; } }
3. 编写Dio网络拦截器
自定义拦截器,在请求发起前触发网络检查:
import 'package:dio/dio.dart'; import 'network_checker.dart'; class PreRequestNetworkInterceptor extends InterceptorsWrapper { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) async { // 先执行网络检查 final hasNetwork = await NetworkChecker.isConnected(); if (!hasNetwork) { // 无网络时抛出错误,中断请求流程 handler.reject( DioException( requestOptions: options, error: "当前无网络连接,请检查网络设置", type: DioExceptionType.cancel, ), true, ); } else { // 有网络,放行请求 handler.next(options); } } }
4. 初始化Dio并挂载拦截器
创建Dio实例时,把拦截器添加进去,确保所有请求都经过检查:
import 'package:dio/dio.dart'; Dio buildDioClient() { final dio = Dio(); // 添加网络检查拦截器 dio.interceptors.add(PreRequestNetworkInterceptor()); // 可按需添加其他拦截器(如日志、Token注入等) return dio; }
5. 使用示例
发起请求时捕获无网络错误,做对应处理:
final dio = buildDioClient(); try { final response = await dio.get("https://api.example.com/data"); // 处理正常响应逻辑 print(response.data); } on DioException catch (e) { if (e.error.toString().contains("当前无网络连接")) { // 提示用户无网络 print(e.error); } else { // 处理其他请求错误 print("请求失败:${e.message}"); } }
注意事项
connectivity_plus仅能判断设备是否连接到网络载体(如WiFi、移动数据),无法保证网络实际可访问(比如连了WiFi但没网)。如果需要更严格的可用性校验,可以在无网络判断后增加一个简单的ping请求(比如请求https://www.baidu.com),但会增加请求耗时,按需选择即可。- 拦截器中的错误提示可根据业务需求自定义,方便后续统一捕获处理。
内容的提问来源于stack exchange,提问作者18Ashelar
相关产品推荐
相关产品推荐

