Flutter网络状态监听插件dio_internet_interceptor的使用

Flutter网络状态监听插件dio_internet_interceptor的使用

dio_internet_interceptor 是一个用于处理无网络时 API 请求的 Dio 拦截器插件。它可以帮助你:

  • 检查网络状态
  • 在无网络时存储请求
  • 提供无网络回调以处理离线数据的增删改查(CRUD)操作
  • 响应回调以更新本地数据库中的远程新数据
  • 重试之前因无网络而失败的请求

使用示例

以下是一个完整的示例,展示如何在 Flutter 应用中使用 dio_internet_interceptor 插件。

示例代码

import 'package:dio/dio.dart';
import 'package:dio_internet_interceptor/dio_internet_interceptor.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart' as path_provider;

final dio = Dio();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Hive 数据库
  final appDocumentDir = await path_provider.getApplicationDocumentsDirectory();
  Hive.init(appDocumentDir.path);
  
  // 添加 Dio 拦截器
  dio.interceptors.add(DioInternetInterceptor(
    onDioRequest: (options) {
      options.isOfflineApi = true; // 标记为离线请求
      return options;
    },
    offlineResponseHandler: (response) {
      print('离线响应: $response');
    },
    onDioError: (DioException err, ErrorInterceptorHandler handler) {
      return DioExceptionHandler(err: err, handler: handler);
    },
  ));
  
  // 设置 Dio 的默认请求头
  dio.options.headers['key'] = 'value';
  
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 发起网络请求
      dio.post(
        'https://httpbin.org/post',
        data: {"bodyKey": "bodyValue", "key": "value"},
        onSendProgress: (count, total) {
          print('上传进度: $count / $total');
        },
      );
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '你已经点击了按钮多少次:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ),
    );
  }
}

代码说明

  1. 初始化 Hive 数据库

    final appDocumentDir = await path_provider.getApplicationDocumentsDirectory();
    Hive.init(appDocumentDir.path);
    

    这里使用 Hive 来存储离线数据。Hive 是一个轻量级的 NoSQL 数据库,适合存储简单的结构化数据。

  2. 添加 Dio 拦截器

    dio.interceptors.add(DioInternetInterceptor(
      onDioRequest: (options) {
        options.isOfflineApi = true;
        return options;
      },
      offlineResponseHandler: (response) {
        print('离线响应: $response');
      },
      onDioError: (DioException err, ErrorInterceptorHandler handler) {
        return DioExceptionHandler(err: err, handler: handler);
      },
    ));
    
    • onDioRequest:在请求发送前标记为离线请求。
    • offlineResponseHandler:处理离线请求的响应。
    • onDioError:处理网络错误。
  3. 发起网络请求

    dio.post(
      'https://httpbin.org/post',
      data: {"bodyKey": "bodyValue", "key": "value"},
      onSendProgress: (count, total) {
        print('上传进度: $count / $total');
      },
    );
    

更多关于Flutter网络状态监听插件dio_internet_interceptor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络状态监听插件dio_internet_interceptor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dio_internet_interceptor 是一个用于 Flutter 的插件,它可以帮助你在使用 Dio 进行网络请求时监听设备的网络状态,并根据网络状态自动处理请求。这个插件特别适合在需要处理网络连接问题的应用中使用。

安装

首先,你需要在 pubspec.yaml 文件中添加 dio_internet_interceptor 依赖:

dependencies:
  dio: ^4.0.0
  dio_internet_interceptor: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本用法

  1. 初始化 Dio 和 Interceptor

    首先,你需要初始化 Dio 并添加 InternetInterceptor

    import 'package:dio/dio.dart';
    import 'package:dio_internet_interceptor/dio_internet_interceptor.dart';
    
    void main() {
      final dio = Dio();
      dio.interceptors.add(InternetInterceptor());
    }
    
  2. 监听网络状态

    InternetInterceptor 会自动监听设备的网络状态。当网络不可用时,它会阻止请求的发送,并返回一个 DioError

    void fetchData() async {
      try {
        final response = await dio.get('https://jsonplaceholder.typicode.com/posts');
        print(response.data);
      } on DioError catch (e) {
        if (e.type == DioErrorType.other) {
          print('No internet connection');
        } else {
          print('Other error: ${e.message}');
        }
      }
    }
    
  3. 自定义处理逻辑

    你可以通过继承 InternetInterceptor 并重写 onNoInternet 方法来自定义处理逻辑。

    class CustomInternetInterceptor extends InternetInterceptor {
      @override
      void onNoInternet(RequestOptions options) {
        // 自定义处理逻辑
        print('Custom handling for no internet');
      }
    }
    
    void main() {
      final dio = Dio();
      dio.interceptors.add(CustomInternetInterceptor());
    }
    

高级用法

  1. 设置重试机制

    你可以在 InternetInterceptor 中设置重试机制,当网络恢复时自动重试失败的请求。

    dio.interceptors.add(InternetInterceptor(
      retryOnConnectionChange: true,
    ));
    
  2. 自定义网络状态检查

    你可以通过实现 NetworkChecker 接口来自定义网络状态的检查逻辑。

    class CustomNetworkChecker implements NetworkChecker {
      @override
      Future<bool> get isConnected async {
        // 自定义网络状态检查逻辑
        return true;
      }
    }
    
    void main() {
      final dio = Dio();
      dio.interceptors.add(InternetInterceptor(
        networkChecker: CustomNetworkChecker(),
      ));
    }
回到顶部