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
更多关于Flutter缓存注解插件cache_annotations的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
cache_annotations
是一个用于 Flutter 和 Dart 的注解库,它可以帮助开发者更方便地实现方法结果的缓存。通过使用注解,你可以轻松地在方法级别上添加缓存逻辑,而无需手动编写大量的缓存管理代码。
1. 安装 cache_annotations
首先,你需要在 pubspec.yaml
文件中添加 cache_annotations
和 build_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
}