Flutter缓存注解插件cache_annotations的使用

Flutter缓存注解插件cache_annotations的使用

本包是一个使用source_gen实现的类型转换生成器,受Retrofit启发,帮助你管理持久化缓存。

使用方法

首先,在你的依赖项中添加注解和生成器:

dependencies:
  cache_annotations: ^1.0.0

dev_dependencies:
  build_runner: ^2.4.8
  cache_generators: ^1.0.0

定义缓存

接下来,定义你的缓存。以下是一个示例代码:

import 'package:cache_annotations/annotations.dart';
import 'package:cache_generator_example/user.dart';

part 'cache.g.dart';

// 使用 @LocalStoreCache 注解来标识一个缓存类。
@LocalStoreCache('my_local_store_cache')
abstract class Cache implements BaseCache {
  // 缓存实例
  static final Cache _instance = _Cache();
  static Cache get instance => _instance;

  // 定义一个持久化的缓存项
  @persistent
  @CacheKey(path: 'device_id')
  CacheEntry<Iterable<String>> deviceId();

  // 定义一个带有自定义序列化逻辑的缓存项
  @CacheKey(fromJson: User.fromJson, toJson: userToJson)
  CacheEntry<User> me();

  // 定义一个具有最大年龄限制的缓存项
  @MaxAge(Duration(seconds: 2))
  @CacheKey(path: 'friends')
  CacheEntry<int> friends();

  // 定义一个带有路径参数的缓存项
  @CacheKey(path: 'friends/{id}')
  CacheEntry<String> friendById(
      @Path('id') int userId,
  );

  // 定义一个带有日期参数和排序的缓存项
  @CacheKey(path: 'likes/{date}')
  CacheEntry<String> likes(
      @Path('date', convert: keyDateConvertor) DateTime date,
      @SortBy(convert: keyDateConvertor) DateTime sortBy,
      @sortBy int test,
  );
}

运行生成器

运行构建器以生成必要的代码:

# 在Dart项目中运行
dart pub run build_runner build

# 在Flutter项目中运行
flutter pub run build_runner build

使用缓存

现在你可以使用生成的缓存类了:

void main() async {
  // 获取缓存实例
  Cache cache = Cache.instance;

  // 设置并获取设备ID
  await cache.deviceId().set(['dummy', 'ok']);
  print(await cache.deviceId().get());

  // 设置并获取用户信息
  await cache.me().set(User('Someone', 26));
  print(await cache.me().get());

  // 设置并获取朋友信息
  await cache.friendById(12).set('Joe');
  print(await cache.friendById(12).get());
}

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

1 回复

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


cache_annotations 是一个用于 Flutter 和 Dart 的注解库,它可以帮助开发者更方便地实现方法结果的缓存。通过使用注解,你可以轻松地在方法级别上添加缓存逻辑,而无需手动编写大量的缓存管理代码。

1. 安装 cache_annotations

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

dependencies:
  flutter:
    sdk: flutter
  cache_annotations: ^1.0.0

dev_dependencies:
  build_runner: ^2.1.0

然后运行 flutter pub get 来获取依赖。

2. 使用 @Cache 注解

cache_annotations 提供了一个 @Cache 注解,你可以将其应用于方法上,以实现方法结果的缓存。

import 'package:cache_annotations/cache_annotations.dart';

class MyService {
  @Cache(ttl: Duration(minutes: 5))
  Future<String> fetchData() async {
    // 模拟一个耗时的网络请求
    await Future.delayed(Duration(seconds: 2));
    return 'Cached Data';
  }
}

在这个例子中,fetchData 方法的结果将被缓存 5 分钟。在这段时间内,任何对 fetchData 的调用都将直接返回缓存的结果,而不会真正执行方法体。

3. 生成缓存代码

cache_annotations 依赖于代码生成,所以你需要使用 build_runner 来生成缓存相关的代码。

在项目根目录下运行以下命令:

flutter pub run build_runner build

这将生成一个名为 my_service.g.dart 的文件,其中包含了缓存逻辑的实现。

4. 使用生成的代码

生成的代码会自动处理缓存的逻辑,你只需要像平常一样调用方法即可。

void main() async {
  final service = MyService();

  // 第一次调用,会执行方法体并将结果缓存
  final data1 = await service.fetchData();
  print(data1); // 输出: Cached Data

  // 第二次调用,直接从缓存中获取结果
  final data2 = await service.fetchData();
  print(data2); // 输出: Cached Data
}

5. 配置缓存存储

cache_annotations 默认使用内存缓存,但你也可以通过实现 CacheStore 接口来使用其他存储方式(如本地文件、数据库等)。

class MyCacheStore extends CacheStore {
  @override
  Future<void> write(String key, dynamic value, Duration ttl) async {
    // 实现缓存写入逻辑
  }

  @override
  Future<dynamic> read(String key) async {
    // 实现缓存读取逻辑
    return null;
  }

  @override
  Future<void> delete(String key) async {
    // 实现缓存删除逻辑
  }
}

然后在使用 @Cache 注解时指定 store 参数:

@Cache(ttl: Duration(minutes: 5), store: MyCacheStore())
Future<String> fetchData() async {
  // ...
}

6. 其他配置

@Cache 注解还支持其他配置,如:

  • key: 自定义缓存的键,默认使用方法名称和参数生成。
  • ttl: 缓存的有效时间(Time to Live),默认情况下为永久有效。
  • store: 指定缓存存储方式,默认使用内存缓存。

7. 清除缓存

你可以通过调用生成的代码中的 clearCache 方法来手动清除缓存。

void main() async {
  final service = MyService();

  // 清除缓存
  service.clearCache();

  // 再次调用,会重新执行方法体并缓存结果
  final data = await service.fetchData();
  print(data); // 输出: Cached Data
}
回到顶部