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

1 回复

更多关于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分钟后,数据将自动从缓存中移除
回到顶部