Flutter数据流缓存插件cache_stream的使用
Flutter数据流缓存插件cache_stream的使用
这个插件可以帮助你在应用中缓存数据,并在请求时从缓存中流式传输这些数据,即使在离线状态下也能提高你的应用速度并改善加载时间。
你可以使用该插件来缓存Dart框架支持的任何类型的数据。
特性
- 缓存任何类型的数据,以便离线使用或更快地渲染。
- 应用安装规则以验证每个被安装的流。
- 如果不再需要从缓存中卸载/刷新流。
- (可选)设置刷新率,以便在间隔内更新流。
- 强制刷新流以覆盖缓存。
使用
要使用此插件,在你的 pubspec.yaml
文件中添加 cache_stream
作为依赖项。
示例
导入库
import 'package:cache_stream/cache_stream.dart';
安装流
CacheStream cacheManager = CacheStream();
// 提供一个 Map<S,M<S,D>> 的已安装条目到缓存流
cacheManager.mount({
'flights': {
'data': () async {
return await FlightController.index();
},
// 可选
'rules': (data){
return data['flight'].isNotEmpty;
},
},
'tickets': {
'data': () async {
return await TicketController.index();
},
'rules': (data) => data.isNotEmpty,
}
// 每隔60秒刷新一次 | null
// 你可以省略 Duration 或将其设置为 null 进行一次性操作
}, Duration(seconds: 60));
获取流
final flights = await cacheManager.stream(
'flights',
fallback: () async {
// 如果找不到流、网络错误或有错误发生
return await FlightController.index();
},
// 可选
callback: (data) {
// 我们已经获取到了数据 - 所以让我们转换最终结果
return flightToModel(data);
}
);
如果你需要强制覆盖缓存以流式传输最新数据,则可以在方法中提供一个 refresh
标志。这将尝试从之前指定的源重新安装流。
final flights = await cacheManager.stream(
'flights',
refresh: true,
//...
);
卸载流
有三种基本方式可以卸载或刷新内存中的流。
// 卸载仅停止刷新计时器(如果在安装调用中设置了)
cacheManager.unmount();
// 卸载并刷新所有已安装的数据流
cacheManager.unmount({});
// 卸载并刷新先前已安装的特定流
cacheManager.unmount({
'flights',
'tickets'
});
注意事项
当试图缓存 Dart 对象时,CacheStream 将抛出致命异常。这是 Dart 预期的行为。要解决此问题,你需要在任何获取或返回对象模型的安装调用中定义一个 toJson
方法。
//flight.dart
//...
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'departure': departure,
'planeId': planeId,
'organization': organization
};
限制
该插件不能在一个单一的流上安装 N(+1) 层。这意味着如果两个相同的流安装了“定时器”,只有最后一个安装的流会被监视(即为了避免应用程序中出现多个时间计数器)。
例如,如果我们有一个名为 “flights” 的流在 flightScreen.dart
中这样安装:
cacheManager.mount({
'flights': {
//...
},
}, Duration(seconds: 60));
而在 ticketScreen.dart
中也安装了同一个流,但指定了不同的刷新计时器。
cacheManager.mount({
'flights': {
//...
},
}, Duration(seconds: 30));
每次你从其中一个屏幕切换时,计时器会为当前屏幕重新安装,导致对同一流(如 “flights”)发出 2(+) 个总的刷新计时器,这可能会成为应用程序的负担或导致延迟,具体取决于流的上下文(如 API 调用或重量级 Future)。
为了避免这个问题,建议为流使用唯一的名称。但是,如果你确实需要再次安装流(可能为了获取新数据然后获取它),则不要在安装时设置刷新计时器或在调用流时使用 refresh
标志。
cacheManager.mount({
'flights': {
//...
},
} /* Duration(seconds: 30) */); //<= 移除 Duration
更多关于Flutter数据流缓存插件cache_stream的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据流缓存插件cache_stream的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
cache_stream
是一个用于 Flutter 的数据流缓存插件,它可以帮助你缓存数据流并在需要时从缓存中获取数据,而不是每次都从网络或其它数据源重新获取。这对于需要频繁访问相同数据的应用场景非常有用,可以提高应用的性能和响应速度。
安装 cache_stream
首先,你需要在 pubspec.yaml
文件中添加 cache_stream
依赖:
dependencies:
flutter:
sdk: flutter
cache_stream: ^0.0.1 # 请使用最新的版本号
然后运行 flutter pub get
来安装依赖。
使用 cache_stream
1. 基本用法
cache_stream
的核心是 CacheStream
类,它允许你缓存数据流并在需要时获取缓存的数据。
import 'package:cache_stream/cache_stream.dart';
void main() async {
// 创建一个 CacheStream 实例
var cacheStream = CacheStream<int>();
// 添加数据到缓存
cacheStream.add(1);
cacheStream.add(2);
cacheStream.add(3);
// 从缓存中获取数据流
var stream = cacheStream.stream;
// 监听数据流
stream.listen((data) {
print('Data from cache: $data');
});
// 你也可以直接获取缓存中的最新数据
var latestData = await cacheStream.latest;
print('Latest data: $latestData');
}
2. 从网络或其他数据源获取数据
你可以使用 CacheStream
来缓存从网络或其他数据源获取的数据。
import 'package:cache_stream/cache_stream.dart';
import 'package:http/http.dart' as http;
void main() async {
var cacheStream = CacheStream<String>();
// 模拟从网络获取数据
Future<String> fetchData() async {
var response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
return response.body;
}
// 从网络获取数据并缓存
var data = await fetchData();
cacheStream.add(data);
// 从缓存中获取数据流
var stream = cacheStream.stream;
// 监听数据流
stream.listen((data) {
print('Data from cache: $data');
});
// 你也可以直接获取缓存中的最新数据
var latestData = await cacheStream.latest;
print('Latest data: $latestData');
}
3. 清除缓存
你可以使用 clear
方法来清除缓存中的数据。
cacheStream.clear();
4. 设置缓存过期时间
cache_stream
还支持设置缓存数据的过期时间。当数据过期时,它将自动从缓存中移除。
var cacheStream = CacheStream<int>(expiryDuration: Duration(minutes: 10));
// 添加数据到缓存
cacheStream.add(1);
// 10分钟后,数据将自动从缓存中移除