Flutter数据缓存管理插件data_cache_manager的使用

Flutter数据缓存管理插件data_cache_manager的使用

Data Cache Manager 是一个用于在 Flutter 中存储和管理 Dart 数据类型的缓存管理插件。

开始使用

将以下内容添加到项目的 pubspec.yaml 文件中:

dependencies:
  data_cache_manager: ^1.2.0

使用方法

初始化

最简单的方法是使用提供的 DefaultDataCacheManager.instance 获取默认的缓存管理器实例:

import 'package:data_cache_manager/data_cache_manager.dart';

final DataCacheManager manager = DefaultDataCacheManager.instance;

向缓存中添加数据

DataCacheManager 可以存储大多数 Dart 数据类型。查看支持的数据类型部分了解支持的数据类型列表。

要向缓存中添加数据,可以使用以下方法:

final String key = 'key';       // 数据的唯一键
final String value = 'value';   // 需要缓存的数据

await manager.add(key, value);  // 将数据添加到本地缓存

存储不同数据时使用相同的键

有时,你可能希望在使用相同键的情况下存储不同的数据。例如,在从数据库查询数据并分页展示数据结果时。你可以传递查询数据时使用的参数作为 Map 来缓存数据:

// 第一页查询时使用的参数
final Map<String, dynamic> firstParams = {'page': 1};

// 第一页的数据
final List<int> firstValue = [0, 1, 2, 3, 4];

// 第二页查询时使用的参数
final Map<String, dynamic> secondParams = {'page': 2};

// 第二页的数据
final List<int> secondValue = [5, 6, 7, 8, 9];

// 向本地缓存添加数据
await manager.add(key, firstValue, queryParams: firstParams);
await manager.add(key, secondValue, queryParams: secondParams);

从缓存中获取数据

要从缓存中获取数据,只需使用与存储数据时相同的键即可:

final cachedData = await manager.get(key);

如果你在存储数据时传递了 queryParams,也可以使用相同的 queryParams 从缓存中获取相应的数据:

// firstCache 将为 [0, 1, 2, 3, 4]
final firstCache = await manager.get(key, queryParams: firstParams);

// secondCache 将为 [5, 6, 7, 8, 9]
final secondCache = await manager.get(key, queryParams: secondParams);

为了避免获取过期的缓存数据,你可以传递一个 DateTime 来告诉缓存管理器数据何时被更新。如果缓存数据的存储时间早于给定的 DateTime,它将返回 null 并移除过期的缓存数据:

final DateTime updatedAt = DateTime.now();

// cachedData 将为 null,因为它已经过期
final cachedData = await manager.get(key, updatedAt: updatedAt);

从缓存中移除数据

要从缓存中移除数据,只需使用与存储数据时相同的键即可:

await manager.remove(key);

如果你在存储数据时传递了 queryParams,也可以使用相同的 queryParams 从缓存中移除相应的数据:

// 移除 [0, 1, 2, 3, 4]
await manager.remove(key, queryParams: firstParams);

// 移除 [5, 6, 7, 8, 9]
await manager.remove(key, queryParams: secondParams);

要移除所有具有相同键的数据,可以使用以下方法:

await manager.removeByKey(key);

自定义配置

如果你想自定义和配置缓存管理器,必须创建自己的类并存储缓存管理器实例。重要的是,整个应用程序中只能创建并使用同一个 dbKey(可配置)的缓存管理器实例。以下是一个示例:

class MyDataCacheManager {
  static DataCacheManager instance = DataCacheManager(
    config: Config(
      dbKey: 'db_key',
      useMemCache: true,
      useNtpDateTime: false,
      cleanupOnInit: false,
      cleanupInterval: Duration(seconds: 30),
      stalePeriod: Duration(days: 30),
      maxCacheSize: 10000000,
    ),
  );
}

更多关于Flutter数据缓存管理插件data_cache_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用data_cache_manager插件进行数据缓存管理的示例代码。data_cache_manager是一个非常流行的Flutter插件,用于管理HTTP请求的缓存。

首先,确保你已经在pubspec.yaml文件中添加了data_cache_manager依赖:

dependencies:
  flutter:
    sdk: flutter
  data_cache_manager: ^3.0.0  # 请检查最新版本号

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

以下是一个完整的示例,展示如何使用data_cache_manager来缓存网络图片和HTTP请求的数据:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:data_cache_manager/data_cache_manager.dart';
import 'package:cached_network_image/cached_network_image.dart';  // 用于缓存网络图片

void main() {
  runApp(MyApp());
}

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final DefaultCacheManager _cacheManager = DefaultCacheManager();

  @override
  void initState() {
    super.initState();
    // 预热缓存管理器,设置默认的最大缓存大小和存储位置
    _cacheManager.openCache();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Data Cache Manager Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Cached Image:', style: TextStyle(fontSize: 20)),
            SizedBox(height: 16),
            CachedNetworkImage(
              imageUrl: 'https://via.placeholder.com/150',
              placeholder: (context, url) => CircularProgressIndicator(),
              errorWidget: (context, url, error) => Icon(Icons.error),
            ),
            SizedBox(height: 32),
            Text('Cached HTTP Data:', style: TextStyle(fontSize: 20)),
            SizedBox(height: 16),
            FutureBuilder<String>(
              future: _fetchCachedData('https://jsonplaceholder.typicode.com/posts/1'),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}');
                  } else {
                    return Text('Fetched Data:\n${snapshot.data}');
                  }
                } else {
                  return CircularProgressIndicator();
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  Future<String> _fetchCachedData(String url) async {
    var response = await _cacheManager.getSingleFile(url);
    if (response.file == null) {
      // 如果缓存中没有数据,则进行网络请求并缓存结果
      var httpResponse = await http.get(Uri.parse(url));
      if (httpResponse.statusCode == 200) {
        await _cacheManager.putFile(url, httpResponse.bodyBytes,
            headers: httpResponse.headers);
      } else {
        throw Exception('Failed to load data: ${httpResponse.statusCode}');
      }
      return httpResponse.body;
    } else {
      // 从缓存中读取数据
      var fileContent = await response.file.readAsString();
      return fileContent;
    }
  }

  @override
  void dispose() {
    // 关闭缓存管理器
    _cacheManager.close();
    super.dispose();
  }
}

解释

  1. 依赖项

    • data_cache_manager:用于管理HTTP请求的缓存。
    • cached_network_image:一个依赖data_cache_manager的插件,用于缓存和显示网络图片。
  2. 初始化缓存管理器

    • initState方法中调用_cacheManager.openCache()来初始化缓存管理器。
  3. 缓存网络图片

    • 使用CachedNetworkImage小部件来显示和缓存网络图片。
  4. 缓存HTTP请求的数据

    • 使用_cacheManager.getSingleFile(url)检查缓存中是否存在数据。
    • 如果缓存中没有数据,则进行HTTP请求并使用_cacheManager.putFile(url, httpResponse.bodyBytes, headers: httpResponse.headers)将响应数据缓存起来。
    • 如果缓存中存在数据,则直接从缓存中读取并返回。
  5. 清理

    • dispose方法中调用_cacheManager.close()来关闭缓存管理器,释放资源。

这个示例展示了如何使用data_cache_manager插件来缓存网络图片和HTTP请求的数据,从而提高应用的性能和用户体验。

回到顶部