Flutter数据缓存插件cache_x的使用

Flutter数据缓存插件CacheX的使用

介绍

CacheX 是一个适用于 Flutter 的可行的数据缓存包,支持加密存储任何类型的数据。它使用 SharedPreference 作为存储介质,并在后台使用 AES 加密和解密数据,以确保数据的安全性。

工作原理

缓存本质上是简单的键值对数据保存过程。CacheX 采用这种方式进行数据缓存。由于安全问题,我们不能直接保存原始数据。因此,CacheX 在缓存数据或从缓存中获取数据时,会在后台使用 AES 加密和解密。

示例项目截图

示例项目截图

入门指南

1. 添加依赖

首先,在 pubspec.yml 文件中添加 CacheX 依赖:

dependencies:
  cache_x: ^latest

请从 pub.dev 获取最新版本号。

2. 初始化 CacheX

在应用的 main 函数中初始化 CacheX。密码长度必须为 128/192/256 位(即 16、24 或 32 个字符)。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化密码
  String password = 'CBoaDQIQAgceGg8dFAkMDBEOECEZCxg=';

  // 初始化 CacheX
  final cacheX = CacheXCore();
  await cacheX.init(password: password);

  // 执行应用的其他初始化工作
  runApp(MyApp());
}
3. 保存和获取数据

你可以使用 CacheX 保存和获取不同类型的数据。以下是一个完整的示例代码,展示了如何保存和获取布尔值、双精度浮点数、整数、字符串和字符串列表。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化密码
  String password = 'CBoaDQIQAgceGg8dFAkMDBEOECEZCxg=';

  // 初始化 CacheX
  final cacheX = CacheXCore();
  await cacheX.init(password: password);

  // 设置值
  await cacheX.saveBool(key: 'dark_mode', value: true);
  await cacheX.saveDouble(key: 'user_rating', value: 4.5);
  await cacheX.saveInt(key: 'user_age', value: 25);
  await cacheX.saveString(key: 'user_name', value: 'Tanvir');
  await cacheX.saveStringList(
    key: 'favorite_colors',
    value: ['Red', 'Green', 'Blue'],
  );

  // 获取值
  print('Dark Mode: ${await cacheX.getBool(key: 'dark_mode', defaultValue: false)}');
  print('User Rating: ${await cacheX.getDouble(key: 'user_rating', defaultValue: 0.0)}');
  print('User Age: ${await cacheX.getInt(key: 'user_age', defaultValue: 0)}');
  print('User Name: ${await cacheX.getString(key: 'user_name', defaultValue: 'Unknown')}');
  print('Favorite Colors: ${await cacheX.getStringList(key: 'favorite_colors', defaultValue: [])}');
  print('All Keys: ${await cacheX.getKeys()}');

  // 检查是否存在某个键
  print('Does key "user_name" exist? ${await cacheX.containsKey(key: 'user_name')}');

  // 删除某个键
  await cacheX.remove(key: 'user_name');
  print('User Name after removal: ${await cacheX.getString(key: 'user_name', defaultValue: 'Unknown')}');

  // 清除所有缓存
  await cacheX.clear();
  print('All Keys after clearing: ${await cacheX.getKeys()}');
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CacheX Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('CacheX Example'),
        ),
        body: Center(
          child: Text('Check the console for cached data!'),
        ),
      ),
    );
  }
}

注意事项

  • 密码长度:密码必须是 128/192/256 位(即 16、24 或 32 个字符)。否则会抛出异常。
  • 默认值:在 get 方法中提供 defaultValue,否则如果键不存在或数据类型不匹配,将返回 null
  • 异步操作:所有 save 方法都返回 Future<bool>,因此需要使用 await 来获取结果。
  • 异常处理:CacheX 可能会抛出以下几种异常:
    • CacheXException:当 CacheXCore 初始化失败或发生其他内部错误时。
    • StorageException:当保存或获取数据时发生错误时。
    • EncryptionException:当加密或解密数据时发生错误时。

高级用法:与 Parse Server 集成

如果你在项目中使用了 parse_server_sdk_flutter,可以将 CacheX 作为默认的核心存储库。只需在初始化 Parse 时指定 CoreStoreCacheXImpl 即可。

import 'package:cache_x/core_store_cacheX_impl.dart';
import 'package:parse_server_sdk_flutter/parse_server_sdk_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 Parse
  await Parse().initialize(
    'your_app_id',
    'your_server_url',
    clientKey: 'your_client_key',
    liveQueryUrl: 'your_live_query_url',
    coreStore: await CoreStoreCacheXImpl.getInstance(
      password: 'u0TCHVOIiEFVwOqqDo1OnLfd3Kx7yaRt',
    ),
    debug: true,
    autoSendSessionId: true,
  );

  // 现在可以直接使用 CacheX 进行本地存储
  final cacheX = CacheXCore.instance;
  await cacheX.saveString(key: 'ft1', value: 'Tanvir');
  print(await cacheX.getString(key: 'ft1'));
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用cache_x插件进行数据缓存的示例。cache_x是一个功能强大的Flutter缓存库,支持内存缓存和持久化缓存。

首先,确保你已经在pubspec.yaml文件中添加了cache_x依赖:

dependencies:
  flutter:
    sdk: flutter
  cache_x: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

示例代码

以下是一个简单的示例,展示了如何使用cache_x进行内存缓存和持久化缓存。

1. 初始化缓存管理器

首先,我们需要初始化一个CacheManager实例。你可以在应用启动时进行这个操作。

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

void main() {
  // 初始化CacheManager实例
  CacheManager cacheManager = CacheManager(
    config: CacheConfig(
      defaultDuration: const Duration(minutes: 10), // 设置默认缓存时间
      maxNrOfCacheObjects: 100, // 设置最大缓存对象数量
      storeInMemory: true, // 是否启用内存缓存
      storeInPersistence: true, // 是否启用持久化缓存
      persistentCacheDir: 'my_cache_dir', // 设置持久化缓存目录
    ),
  );

  runApp(MyApp(cacheManager: cacheManager));
}

class MyApp extends StatelessWidget {
  final CacheManager cacheManager;

  MyApp({required this.cacheManager});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(cacheManager: cacheManager),
    );
  }
}

2. 使用缓存管理器获取和存储数据

在HomeScreen中,我们将展示如何使用CacheManager来获取和存储数据。

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

class HomeScreen extends StatefulWidget {
  final CacheManager cacheManager;

  HomeScreen({required this.cacheManager});

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('CacheX Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 从缓存中获取数据
                String? cachedData = await widget.cacheManager.getObject<String>('my_key');
                if (cachedData != null) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Cached Data: $cachedData')),
                  );
                } else {
                  // 如果缓存中没有数据,则从网络或其他地方获取数据,并存储到缓存中
                  String newData = 'Hello, this is new data!';
                  await widget.cacheManager.putObject<String>('my_key', newData);
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Data fetched and cached')),
                  );
                }
              },
              child: Text('Get/Cache Data'),
            ),
            ElevatedButton(
              onPressed: () async {
                // 清除缓存中的数据
                await widget.cacheManager.removeObject('my_key');
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Cache cleared')),
                );
              },
              child: Text('Clear Cache'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 初始化CacheManager:在main函数中,我们创建了一个CacheManager实例,并配置了缓存的默认持续时间、最大缓存对象数量、内存缓存和持久化缓存的设置。

  2. 获取和存储数据:在HomeScreen中,我们有两个按钮。第一个按钮尝试从缓存中获取数据。如果缓存中没有数据,它会生成一些新数据并将其存储到缓存中。第二个按钮用于清除缓存中的数据。

  3. 显示SnackBar:为了用户交互的反馈,我们使用ScaffoldMessenger.of(context).showSnackBar来显示SnackBar消息。

这个示例展示了如何使用cache_x进行基本的数据缓存操作。你可以根据需要进一步扩展和自定义缓存行为。

回到顶部