Flutter缓存数据插件cached_value的使用

发布于 1周前 作者 sinazl 来自 Flutter

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 提供了一种有效的方式去存储和复用跨帧的数据,例如 PaintTextPainter 实例等。这有助于提高性能并减少不必要的重复计算。

例如,在一个自定义渲染对象中,我们可以使用 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

1 回复

更多关于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'),
        ),
      ),
    );
  }
}

解释

  1. 依赖导入

    • cached_value 用于数据缓存。
    • http 用于发送 HTTP 请求。
  2. CachedValueProvider

    • CachedValueProvider<T> 是一个泛型类,用于管理缓存数据。
  3. 获取数据

    • _fetchData 方法中,我们使用 _cachedValueProvider.get 方法来获取缓存的数据。
    • key 参数用于标识缓存数据的唯一键。
    • valueBuilder 是一个异步函数,当缓存数据不存在时会被调用以获取新数据。
    • duration 参数设置缓存数据的有效期。
  4. UI 更新

    • 在获取到数据后,我们使用 setState 方法更新 UI(在这个示例中,只是简单地将数据打印到控制台)。

注意事项

  • 在实际应用中,你可能会将缓存的数据存储在一个状态变量中,并在 UI 中显示它。
  • cached_value 插件允许你设置缓存数据的各种策略,例如最大缓存项数量、缓存清理策略等,具体可以参考其文档。

希望这个示例能够帮助你理解如何在 Flutter 应用中使用 cached_value 插件来缓存数据。

回到顶部