Flutter本地缓存管理插件nosql_cache_manager的使用

Flutter本地缓存管理插件nosql_cache_manager的使用

cache_manager 包为 Flutter 应用程序提供了高效地存储和检索本地缓存数据的解决方案。此包利用了 Sembast 数据库进行持久化存储,并使用了 path_provider 包来定位设备上的适当存储路径。它是希望优化网络请求、减少延迟并提升用户体验的开发者的理想选择。

特性

  • 高效的缓存数据:缓存数据以实现更快的访问和减少网络请求。
  • 可定制的缓存过期时间:可以设置缓存数据的自定义过期时间。
  • 检索和更新缓存数据:轻松获取和更新缓存中的数据。
  • 清除特定或全部缓存:移除单个缓存条目或清除所有缓存数据。
  • 持久化存储:使用 Sembast 进行长期数据存储。
  • 与路径提供者集成:自动定位 Android 和 iOS 设备上用于存储缓存数据的正确目录。
  • 错误处理:在获取、更新或删除缓存条目时提供强大的错误处理。

开始使用

要在 Flutter 项目中使用 cache_manager 包,需要将以下依赖项添加到您的 pubspec.yaml 文件中:

dependencies:
  cache_manager: ^1.0.0

同时确保包含所需的其他包:

dependencies:
  sembast: ^3.1.0
  path_provider: ^2.0.10

使用方法

初始化缓存管理器

在存储或检索数据之前,需要初始化 CacheManager

import 'package:cache_manager/cache_manager.dart';

void main() {
  CacheManager cacheManager = CacheManager();
}
设置缓存数据

您可以使用 setCache 方法缓存任何数据(例如 API 响应、用户偏好等):

await cacheManager.setCache('user_profile', {'name': 'John Doe', 'email': 'john@example.com'}, duration: Duration(hours: 1)); // 缓存过期时间为1小时
检索缓存数据

使用 getCache 方法检索缓存数据。如果数据已过期,则返回 null

final userProfile = await cacheManager.getCache('user_profile');

if (userProfile != null) {
  print('Cached User Profile: $userProfile');
} else {
  print('Cache expired or not available.');
}
删除缓存数据

可以通过键删除特定的缓存数据:

await cacheManager.deleteCache('user_profile');
清除所有缓存数据

要移除所有缓存条目,可以使用 clearAllCache 方法:

await cacheManager.clearAllCache();

完整示例代码

以下是一个完整的示例,展示了如何使用 cache_manager 插件:

import 'package:flutter/material.dart';
import 'package:cache_manager/cache_manager.dart';

void main() {
  final CacheManager cacheManager = CacheManager();
  cacheManager.init();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cache Manager Example',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Cache Manager Example'),
        ),
        body: const CacheManageExample(),
      ),
    );
  }
}

class CacheManageExample extends StatefulWidget {
  const CacheManageExample({super.key});

  [@override](/user/override)
  State<CacheManageExample> createState() => _CacheManageExampleState();
}

class _CacheManageExampleState extends State<CacheManageExample> {
  final cacheManager = CacheManager();
  String _cacheDisplay = 'No data cached';

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadCache();
  }

  Future<void> _loadCache() async {
    final cache = await cacheManager.getCache('user_profile');
    setState(() {
      _cacheDisplay = cache != null
          ? 'Cache data: ${cache.toString()}'
          : 'Cache not found or expired';
    });
  }

  Future<void> _setCache() async {
    await cacheManager.setCache(
      'user_profile',
      {'name': 'Jane Doe', 'age': 25},
      duration: const Duration(minutes: 5),
    );
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('Cache set successfully!')),
    );
    _loadCache();
  }

  Future<void> _getCache() async {
    final cache = await cacheManager.getCache('user_profile');
    final message = cache != null
        ? 'Cache data: ${cache.toString()}'
        : 'Cache not found or expired';
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(message)),
    );
    _loadCache();
  }

  Future<void> _deleteCache() async {
    await cacheManager.deleteCache('user_profile');
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('Cache deleted successfully!')),
    );
    _loadCache();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: _setCache,
            child: const Text('Set Cache'),
          ),
          const SizedBox(height: 10),
          ElevatedButton(
            onPressed: _getCache,
            child: const Text('Get Cache'),
          ),
          const SizedBox(height: 10),
          ElevatedButton(
            onPressed: _deleteCache,
            child: const Text('Delete Cache'),
          ),
          const SizedBox(height: 20),
          Text(
            _cacheDisplay,
            style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


nosql_cache_manager 是一个用于 Flutter 的本地缓存管理插件,它提供了简单易用的 API 来管理和存储键值对数据。这个插件可以帮助你在应用中实现高效的本地数据缓存,适合存储一些小规模的、非结构化的数据。

安装

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

dependencies:
  flutter:
    sdk: flutter
  nosql_cache_manager: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

基本使用

初始化

在使用 nosql_cache_manager 之前,你需要初始化它。通常可以在应用的 main 函数中进行初始化。

import 'package:nosql_cache_manager/nosql_cache_manager.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await NosqlCacheManager.init();
  runApp(MyApp());
}

存储数据

你可以使用 put 方法来存储数据。put 方法接受一个键和一个值,并将其存储在缓存中。

await NosqlCacheManager.put('key1', 'value1');
await NosqlCacheManager.put('key2', 123);
await NosqlCacheManager.put('key3', true);

获取数据

你可以使用 get 方法来获取存储的数据。get 方法接受一个键,并返回与该键关联的值。

String? value1 = await NosqlCacheManager.get<String>('key1');
int? value2 = await NosqlCacheManager.get<int>('key2');
bool? value3 = await NosqlCacheManager.get<bool>('key3');

删除数据

你可以使用 delete 方法来删除指定的键值对。

await NosqlCacheManager.delete('key1');

清除所有数据

你可以使用 clear 方法来清除所有缓存数据。

await NosqlCacheManager.clear();

检查键是否存在

你可以使用 containsKey 方法来检查某个键是否存在于缓存中。

bool exists = await NosqlCacheManager.containsKey('key1');

高级用法

存储复杂对象

nosql_cache_manager 支持存储复杂对象,你可以将对象序列化为 JSON 字符串后再存储。

class User {
  final String name;
  final int age;

  User(this.name, this.age);

  Map<String, dynamic> toJson() => {
    'name': name,
    'age': age,
  };

  factory User.fromJson(Map<String, dynamic> json) => User(
    json['name'],
    json['age'],
  );
}

void saveUser() async {
  User user = User('John Doe', 30);
  String jsonString = jsonEncode(user.toJson());
  await NosqlCacheManager.put('user', jsonString);
}

void getUser() async {
  String? jsonString = await NosqlCacheManager.get<String>('user');
  if (jsonString != null) {
    Map<String, dynamic> jsonMap = jsonDecode(jsonString);
    User user = User.fromJson(jsonMap);
    print('User: ${user.name}, ${user.age}');
  }
}

设置过期时间

你可以为存储的数据设置过期时间。当数据过期后,它将自动从缓存中删除。

await NosqlCacheManager.put('key1', 'value1', expiration: Duration(minutes: 10));

获取所有键

你可以使用 getAllKeys 方法来获取缓存中所有的键。

List<String> keys = await NosqlCacheManager.getAllKeys();
回到顶部