Flutter数据缓存插件data_cache_x的使用
Flutter数据缓存插件data_cache_x的使用
data_cache_x
一个使用Hive作为后端的Dart包,用于缓存数据,并支持自动清理过期项。
特性
- 数据缓存:使用Hive作为底层存储来存储和检索任意类型的数据。
- 依赖注入:利用
get_it
进行依赖注入,便于替换不同的缓存适配器。 - Hive集成:利用Hive的NoSQL数据库能力实现快速高效的数据存储。
- 自动后台清理:使用
workmanager
包自动移除缓存中的过期项,确保存储空间的有效利用。 - 自定义过期时间:为缓存项设置过期时间,允许对数据新鲜度进行细粒度控制。
- 错误处理:包含强大的错误处理机制,针对各种错误情况抛出定制异常。
- 可扩展性:设计时考虑到扩展性,便于开发人员轻松添加其他存储适配器的支持。
安装
在pubspec.yaml
文件中添加data_cache_x
:
dependencies:
data_cache_x: ^latest_version
然后运行flutter pub get
以安装该包。
使用
基本用法
-
初始化包
import 'package:data_cache_x/data_cache_x.dart'; import 'package:data_cache_x/service_locator.dart'; Future<void> main() async { // 初始化服务定位器 await setupDataCacheX(); // 获取DataCacheX实例 final dataCache = getIt<DataCacheX>(); // ... }
-
存储数据
// 存储字符串并设置1小时过期时间 await dataCache.put('myKey', 'myValue', expiry: Duration(hours: 1)); // 存储整数且不设置过期时间 await dataCache.put('anotherKey', 42);
-
检索数据
// 检索字符串值 final myValue = await dataCache.get<String>('myKey'); print(myValue); // 输出: myValue (如果未过期) // 检索整数值 final anotherValue = await dataCache.get<int>('anotherKey'); print(anotherValue); // 输出: 42
-
删除数据
await dataCache.delete('myKey');
-
清空缓存
await dataCache.clear();
-
检查键是否存在
final exists = await dataCache.containsKey('myKey'); print(exists); // 输出: true 或 false
高级用法
-
初始化后台清理
import 'package:data_cache_x/utils/background_cleanup.dart'; // ... // 初始化后台清理(在设置服务定位器后调用) initializeBackgroundCleanup();
这将调度每小时运行一次的任务,以从缓存中移除过期项。
-
使用不同的缓存适配器
可以通过实现
CacheAdapter
接口创建自己的缓存适配器,然后将其注册到服务定位器中。// 示例:创建自定义缓存适配器(未在提供的代码中实现) class MyCustomAdapter implements CacheAdapter { // 实现CacheAdapter方法 // ... } // 将自定义适配器注册到服务定位器 getIt.registerSingleton<CacheAdapter>(MyCustomAdapter()); // 使用自定义适配器 getIt.registerSingleton<DataCacheX>(DataCacheX(getIt<CacheAdapter>()));
API 参考
DataCacheX
put<T>(String key, T value, {Duration? expiry})
: 在缓存中存储一个带有可选过期时间的值。get<T>(String key)
: 从缓存中检索一个值。如果键不存在或项已过期,则返回null
。delete(String key)
: 从缓存中删除一个值。clear()
: 清空整个缓存。containsKey(String key)
: 检查缓存中是否存在指定键。
CacheItem
value
: 要缓存的实际值。expiry
: 表示缓存项过期日期的可选DateTime
对象。isExpired
: 如果项已过期则返回true
。
异常
DataCacheXException
: 与数据存储操作相关的通用异常。KeyNotFoundException
: 当指定键不在缓存中时抛出。DataTypeMismatchException
: 当期望的数据类型与实际数据类型不匹配时抛出。StorageException
: 与底层存储机制相关的错误。CacheException
: 与缓存操作相关的通用异常。
示例代码
import 'package:example/news_app/bloc/news_bloc.dart';
import 'package:example/news_app/screens/news_screen.dart';
import 'package:example/service_locator.dart';
import 'package:example/todo_app/bloc/todo_bloc.dart';
import 'package:example/todo_app/screens/todo_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await setup();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'DataCacheX Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('DataCacheX Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider<NewsBloc>(
create: (context) => getIt<NewsBloc>(),
child: const NewsScreen(),
),
),
);
},
child: const Text('News App'),
),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider<TodoBloc>(
create: (context) => getIt<TodoBloc>()..add(LoadTodosEvent()),
child: const TodoScreen(),
),
),
);
},
child: const Text('Todo App'),
),
],
),
),
);
}
}
更多关于Flutter数据缓存插件data_cache_x的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据缓存插件data_cache_x的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
data_cache_x
是一个用于 Flutter 应用的数据缓存插件,它可以帮助开发者轻松地缓存数据并管理缓存的生命周期。以下是 data_cache_x
的基本使用方法和示例。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 data_cache_x
依赖:
dependencies:
flutter:
sdk: flutter
data_cache_x: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化缓存
在使用 data_cache_x
之前,你需要初始化缓存。通常可以在 main.dart
中进行初始化:
import 'package:data_cache_x/data_cache_x.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化缓存
await DataCacheX().init(
defaultCacheTime: Duration(days: 7), // 默认缓存时间
cacheDir: 'my_cache_directory', // 缓存目录名称
);
runApp(MyApp());
}
3. 使用缓存
data_cache_x
提供了多种方法来缓存和获取数据。以下是一些常见的用法示例:
3.1 缓存数据
你可以使用 setCache
方法来缓存数据:
import 'package:data_cache_x/data_cache_x.dart';
void cacheData() async {
await DataCacheX().setCache(
key: 'user_profile', // 缓存键
value: {'name': 'John Doe', 'age': 30}, // 缓存值
cacheTime: Duration(days: 1), // 缓存时间
);
}
3.2 获取缓存数据
使用 getCache
方法来获取缓存数据:
import 'package:data_cache_x/data_cache_x.dart';
void getCachedData() async {
Map<String, dynamic>? cachedData = await DataCacheX().getCache(key: 'user_profile');
if (cachedData != null) {
print('Cached Data: $cachedData');
} else {
print('No cached data found.');
}
}
3.3 删除缓存数据
使用 removeCache
方法来删除缓存数据:
import 'package:data_cache_x/data_cache_x.dart';
void removeCachedData() async {
await DataCacheX().removeCache(key: 'user_profile');
}
3.4 清空所有缓存
使用 clearCache
方法来清空所有缓存:
import 'package:data_cache_x/data_cache_x.dart';
void clearAllCache() async {
await DataCacheX().clearCache();
}
4. 缓存策略
data_cache_x
允许你自定义缓存策略,例如设置默认缓存时间、缓存目录等。你可以在初始化时配置这些参数:
await DataCacheX().init(
defaultCacheTime: Duration(days: 7), // 默认缓存时间
cacheDir: 'my_cache_directory', // 缓存目录名称
maxCacheSize: 100 * 1024 * 1024, // 最大缓存大小 (100 MB)
);
5. 缓存生命周期管理
data_cache_x
支持自动管理缓存的生命周期。你可以通过设置 cacheTime
来控制缓存的有效期。超过有效期的缓存数据会被自动清理。
6. 注意事项
- 确保在异步函数中使用
await
来等待缓存操作完成。 - 缓存数据的大小和数量受设备存储空间的限制,建议合理设置缓存策略。
7. 示例应用
以下是一个简单的示例应用,展示了如何使用 data_cache_x
来缓存和获取数据:
import 'package:flutter/material.dart';
import 'package:data_cache_x/data_cache_x.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await DataCacheX().init(defaultCacheTime: Duration(days: 7));
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: CacheExample(),
);
}
}
class CacheExample extends StatefulWidget {
[@override](/user/override)
_CacheExampleState createState() => _CacheExampleState();
}
class _CacheExampleState extends State<CacheExample> {
Map<String, dynamic>? cachedData;
void _cacheData() async {
await DataCacheX().setCache(
key: 'user_profile',
value: {'name': 'John Doe', 'age': 30},
cacheTime: Duration(days: 1),
);
setState(() {
cachedData = {'name': 'John Doe', 'age': 30};
});
}
void _getCachedData() async {
Map<String, dynamic>? data = await DataCacheX().getCache(key: 'user_profile');
setState(() {
cachedData = data;
});
}
void _removeCachedData() async {
await DataCacheX().removeCache(key: 'user_profile');
setState(() {
cachedData = null;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('DataCacheX Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (cachedData != null)
Text('Cached Data: $cachedData')
else
Text('No cached data found.'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _cacheData,
child: Text('Cache Data'),
),
ElevatedButton(
onPressed: _getCachedData,
child: Text('Get Cached Data'),
),
ElevatedButton(
onPressed: _removeCachedData,
child: Text('Remove Cached Data'),
),
],
),
),
);
}
}