Flutter缓存数据插件cached_value的使用
Flutter缓存数据插件cached_value的使用
cached_value
是一个用于Flutter应用中简化昂贵操作结果缓存的插件。它非常适合那些计算值会随某些条件变化,且不应每次访问时都重新计算的情况。
安装
要在项目中使用 cached_value
,你需要在 pubspec.yaml
文件中添加如下依赖:
dependencies:
cached_value: ^latest_version # 替换为最新版本号
然后执行命令安装:
dart pub add cached_value
使用方法
创建简单的手动失效缓存
最基础的用法是创建一个简单的缓存,并允许我们手动标记其有效性。
int factorial(int n) {
if (n < 0) throw Exception('Negative numbers are not allowed.');
return n <= 1 ? 1 : n * factorial(n - 1);
}
void main() {
int originalValue = 1;
final factorialCache = CachedValue(() => factorial(originalValue));
print(factorialCache.value); // 输出:1
originalValue = 6;
print(factorialCache.value); // 输出:1(因为缓存未失效)
print(factorialCache.isValid); // 输出:true
// 标记缓存无效
factorialCache.invalidate();
print(factorialCache.isValid); // 输出:false
print(factorialCache.value); // 输出:720(缓存已刷新)
print(factorialCache.isValid); // 输出:true
}
当访问 value
属性而缓存无效时,会自动刷新缓存。也可以通过调用 refresh()
方法来手动刷新。
添加依赖关系
如果希望根据某些变量的变化自动使缓存失效,可以为缓存添加依赖项。
final factorialCache = CachedValue(
() => factorial(originalValue),
).withDependency(() => originalValue);
originalValue = 6;
print(factorialCache.isValid); // 输出:false
print(factorialCache.value); // 输出:720
⚠️ 注意:依赖回调会在每次访问值时被调用,因此应尽量保持该回调尽可能简单和快速。
设置生存时间(TTL)
还可以设置缓存的有效期,使其在一定时间后自动失效。
Future<void> withTimeToLive() async {
var originalValue = 1;
final factorialCache = CachedValue(
() => factorial(originalValue),
).withTimeToLive(
lifetime: const Duration(seconds: 3),
);
originalValue = 6;
print(factorialCache.value); // 输出:1
await Future.delayed(const Duration(seconds: 3));
print(factorialCache.value); // 输出:720
}
更多文档
有关更详细的API文档,请参阅 官方API文档。
动机
对于像Flutter渲染对象这样的声明式API来说,cached_value
提供了一种有效的方式去存储和复用跨帧的数据,例如 Paint
和 TextPainter
实例等。这有助于提高性能并减少不必要的重复计算。
例如,在一个自定义渲染对象中,我们可以使用 CachedValue
来缓存 Paint
对象:
class BlurredRenderObject extends RenderObject {
double _blurSigma = 0.0;
set blurSigma(double value) {
_blurSigma = value;
markNeedsPaint();
}
// 添加缓存
late final paintCache = CachedValue(
() => Paint()..maskFilter = MaskFilter.blur(BlurStyle.normal, _blurSigma),
).withDependency(() => _blurSigma);
@override
void paint(PaintingContext context, Offset offset) {
final canvas = context.canvas;
final paint = paintCache.value;
canvas.drawRect(Rect.fromLTWH(0, 0, 100, 100), paint);
}
}
通过这种方式,我们可以在不改变原有逻辑的情况下,轻松地实现对频繁使用的资源进行缓存优化。
更多关于Flutter缓存数据插件cached_value的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter缓存数据插件cached_value的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,cached_value
是一个在 Flutter 中用于缓存数据的插件,它可以简化数据缓存的逻辑,提高应用的性能和用户体验。下面是一个使用 cached_value
插件的示例代码,展示如何在 Flutter 应用中缓存数据。
首先,确保你已经在 pubspec.yaml
文件中添加了 cached_value
依赖:
dependencies:
flutter:
sdk: flutter
cached_value: ^x.y.z # 请替换为最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,我们编写一个示例,展示如何使用 cached_value
来缓存一个 API 请求的结果。
示例代码
import 'package:flutter/material.dart';
import 'package:cached_value/cached_value.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _cachedValueProvider = CachedValueProvider<String>();
Future<void> _fetchData() async {
// 假设我们有一个 API 端点
final url = 'https://api.example.com/data';
// 使用 cached_value 获取数据
final cachedData = await _cachedValueProvider.get(
key: 'api_data',
valueBuilder: () async {
// 这里进行实际的 API 请求
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
return response.body; // 返回 API 响应体
} else {
throw Exception('Failed to load data');
}
},
duration: const Duration(minutes: 5), // 设置缓存时间
);
// 更新 UI
setState(() {
// 这里你可以将 cachedData 显示在 UI 上
// 例如:_data = cachedData;
print('Fetched data: $cachedData');
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Cached Value Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _fetchData,
child: Text('Fetch Data'),
),
),
);
}
}
解释
-
依赖导入:
cached_value
用于数据缓存。http
用于发送 HTTP 请求。
-
CachedValueProvider:
CachedValueProvider<T>
是一个泛型类,用于管理缓存数据。
-
获取数据:
_fetchData
方法中,我们使用_cachedValueProvider.get
方法来获取缓存的数据。key
参数用于标识缓存数据的唯一键。valueBuilder
是一个异步函数,当缓存数据不存在时会被调用以获取新数据。duration
参数设置缓存数据的有效期。
-
UI 更新:
- 在获取到数据后,我们使用
setState
方法更新 UI(在这个示例中,只是简单地将数据打印到控制台)。
- 在获取到数据后,我们使用
注意事项
- 在实际应用中,你可能会将缓存的数据存储在一个状态变量中,并在 UI 中显示它。
cached_value
插件允许你设置缓存数据的各种策略,例如最大缓存项数量、缓存清理策略等,具体可以参考其文档。
希望这个示例能够帮助你理解如何在 Flutter 应用中使用 cached_value
插件来缓存数据。