Flutter网络请求与缓存管理插件flutter_cache_manager_dio的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter网络请求与缓存管理插件 flutter_cache_manager_dio 的使用

flutter_cache_manager_dio 是一个结合了 dioflutter_cache_manager 的插件,旨在简化 Flutter 应用中的网络请求和缓存管理。它类似于 flutter_cache_manager_firebase,但使用的是 dio 作为 HTTP 客户端。

开始使用

初始化 DioCacheManager

首先,你需要初始化 DioCacheManager,并配置 Dio 实例。你还可以为 Dio 添加拦截器(如日志拦截器)来监控网络请求。

import 'package:dio/dio.dart';
import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart';

void main() {
  var dio = Dio();
  // 添加日志拦截器
  dio.interceptors.add(LogInterceptor(responseBody: false));
  
  // 初始化 DioCacheManager
  DioCacheManager.initialize(dio);

  runApp(MyApp());
}

获取缓存文件

你可以使用 DioCacheManager.instance.getSingleFile(url) 方法来获取指定 URL 的缓存文件。如果本地没有缓存,它会自动从网络下载并保存到缓存中。

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

class MyWidget extends StatelessWidget {
  final String url = "https://example.com/image.png";

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FutureBuilder<File>(
      future: DioCacheManager.instance.getSingleFile(url),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
          return Image.file(snapshot.data!);
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        }
        return CircularProgressIndicator();
      },
    );
  }
}

使用 cached_network_image 插件

flutter_cache_manager_dio 可以与 cached_network_image 插件一起使用,方便地显示带有缓存功能的网络图片。

import 'package:flutter/material.dart';
import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart';
import 'package:cached_network_image/cached_network_image.dart';

class MyImageWidget extends StatelessWidget {
  final String url = "https://example.com/image.png";

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CachedNetworkImage(
      cacheManager: DioCacheManager.instance,
      imageUrl: url,
      placeholder: (context, url) => CircularProgressIndicator(),
      errorWidget: (context, url, error) => Container(
        child: Text('error'),
      ),
    );
  }
}

示例 Demo

下面是一个完整的示例应用,展示了如何使用 flutter_cache_manager_dio 来处理网络请求和缓存。

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart';
import 'package:cached_network_image/cached_network_image.dart';

void main() {
  var dio = Dio();
  dio.interceptors.add(LogInterceptor(responseBody: false));
  DioCacheManager.initialize(dio);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Cache Manager Dio Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Cache Manager Dio Demo Home Page'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String imageUrl = "https://example.com/image.png";

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CachedNetworkImage(
              cacheManager: DioCacheManager.instance,
              imageUrl: imageUrl,
              placeholder: (context, url) => CircularProgressIndicator(),
              errorWidget: (context, url, error) => Icon(Icons.error),
            ),
            SizedBox(height: 20),
            FutureBuilder<File>(
              future: DioCacheManager.instance.getSingleFile(imageUrl),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
                  return Image.file(snapshot.data!);
                } else if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                }
                return CircularProgressIndicator();
              },
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter网络请求与缓存管理插件flutter_cache_manager_dio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求与缓存管理插件flutter_cache_manager_dio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_cache_manager_dio 插件进行 Flutter 网络请求与缓存管理的代码示例。这个插件结合了 dioflutter_cache_manager,允许你进行 HTTP 请求并自动管理缓存。

首先,确保在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.4
  flutter_cache_manager: ^3.1.3
  flutter_cache_manager_dio: ^2.1.1

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

接下来,在你的 Dart 文件中,你可以按照以下步骤配置和使用 flutter_cache_manager_dio

import 'package:dio/dio.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart';

void main() async {
  // 配置缓存管理器
  final cacheManager = DefaultCacheManager(
    Config(
      "your_app_name", // 缓存目录的名称
      maxNrOfCacheObjects: 100, // 最大缓存对象数量
      maxAge: Duration(days: 7), // 缓存对象最大存活时间
      storeIdle: true, // 是否在对象空闲时存储
      checkForUpdates: UpdatePolicy.onEveryFetch, // 检查更新的策略
    ),
  );

  // 创建带有缓存功能的 Dio 实例
  final dio = Dio();
  final cacheDio = Cachedio(dio, cacheManager);

  // 使用 Cachedio 进行网络请求
  try {
    Response<String> response = await cacheDio.get(
      'https://jsonplaceholder.typicode.com/posts/1',
      options: Options(
        headers: {
          'Accept': 'application/json',
        },
      ),
    );

    print('Data: ${response.data}');
    print('Is from cache: ${response.extra?.isFromCache}');
  } catch (e) {
    print('Error: $e');
  }

  // 清理缓存
  // await cacheManager.emptyCache(); // 清空所有缓存
  // await cacheManager.deleteFromCache('https://jsonplaceholder.typicode.com/posts/1'); // 删除特定 URL 的缓存
}

代码说明:

  1. 配置缓存管理器: 使用 DefaultCacheManager 并配置缓存的一些参数,比如缓存目录名称、最大缓存对象数量、缓存对象最大存活时间等。

  2. 创建带有缓存功能的 Dio 实例: 使用 Cachedio 包装 Dio 实例,并传入配置好的缓存管理器。

  3. 进行网络请求: 使用 cacheDio.get 方法进行 HTTP GET 请求。响应对象 Response 中包含一个 extra 属性,其中 isFromCache 可以告诉你这个响应是从网络获取的还是从缓存中获取的。

  4. 清理缓存: 你可以使用 cacheManager.emptyCache() 清空所有缓存,或者使用 cacheManager.deleteFromCache(url) 删除特定 URL 的缓存。

这个例子展示了如何使用 flutter_cache_manager_dio 插件进行网络请求并管理缓存。你可以根据实际需求调整缓存配置和请求逻辑。

回到顶部