Flutter异步数据缓存与构建插件cached_future_builder的使用

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

Flutter异步数据缓存与构建插件cached_future_builder的使用

cached_future_builder

cached_future_builder 是一个为简化异步数据获取管理而设计的 Flutter 包。它通过内置缓存功能来提供数据缓存功能。这个包允许你缓存从 Future 中获取的数据,并在以后访问它,显著提高应用程序性能并增强用户体验,特别是在网络请求中。

主要特性:

  • 自动缓存cached_future_builder 自动缓存从 Future 获取的结果。这意味着当再次请求相同的数据时,可以从缓存中获取数据,从而提供更快的响应时间和减少重复的网络调用。

  • 自定义缓存持续时间:用户可以指定缓存数据的有效期。此功能使您可以控制缓存的生命周期,确保可以在必要时刷新数据,同时仍能从缓存响应中受益。

  • 强制刷新:该包提供了一种在需要时强制刷新缓存数据的方法。这对于需要确保用户访问最新信息的场景特别有用,允许您绕过缓存并直接从网络获取新数据。

  • 模型序列化:该包支持通过 fromJsontoJson 方法进行数据的序列化和反序列化。这使得您可以无缝地处理自己的数据模型,并有效管理应用程序中的数据流。

使用场景:

  • 社交媒体应用:你可以利用缓存功能快速显示用户资料、帖子或评论,从而提升整体用户体验。

  • 电子商务应用:该包非常适合缓存产品详情、用户评论或促销优惠,以实现更快的加载时间和改进的响应能力。

  • 天气应用:频繁更新的天气数据可以从该包中获益,确保用户高效地接收最新信息。

cached_future_builder 是现代 Flutter 应用程序中增强性能和用户体验的有效数据缓存工具。如果你正在寻找一个可靠且灵活的解决方案,建议将此包集成到你的项目中。

安装

  1. pubspec.yaml 文件中添加依赖项:
dependencies:
    cached_future_builder: ^1.0.5
  1. 运行 flutter pub get 命令来安装该包。

  2. main.dart 文件中初始化缓存系统(可选):

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 如果想要加快缓存系统的加载速度,则运行此行代码
  // await CacheManager().initCache();

  runApp(const MyApp());
}

使用方法

定义模型

创建一个继承自 BaseModel 并实现 fromJsontoJson 方法的模型类:

class MyModel extends BaseModel {
  final String name;
  final int age;

  MyModel({required this.name, required this.age});

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

  @override
  MyModel fromJson(Map<String, dynamic> json) {
    return MyModel(
      name: json['name'],
      age: json['age'],
    );
  }
}
使用 CachedFutureWidget 缓存数据

将你的数据获取逻辑包装在 CachedFutureWidget 中,提供获取函数、缓存键、模型和构建器:

import 'package:flutter/material.dart';
import 'package:cached_future_builder/src/cached_future_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('缓存未来示例')),
        body: CachedFutureWidget<MyModel>(
          fetchFunction: () async {
            // 模拟带有延迟的网络请求
            await Future.delayed(Duration(seconds: 2));
            return MyModel(name: 'John Doe', age: 30);
          },
          cacheKey: 'my_model_data',
          model: MyModel(name: '', age: 0), // 默认/空模型实例
          cacheDuration: Duration(minutes: 10), // 可选缓存有效期
          forceRefresh: false, // 设置为true以强制刷新并绕过缓存
          builder: (context, data) {
            return Center(
              child: Text('姓名: ${data.name}, 年龄: ${data.age}'),
            );
          },
        ),
      ),
    );
  }
}
CacheManager

CacheManager 处理所有缓存操作。如果需要,还可以手动与缓存进行交互:

final CacheManager cacheManager = CacheManager();
await cacheManager.initCache();

// 保存数据
await cacheManager.saveData('key', MyModel(name: 'John Doe', age: 30));

// 检索数据
MyModel? model = cacheManager.getData('key', MyModel(name: '', age: 0));

// 删除数据
await cacheManager.deleteData('key');

参数说明

  • fetchFunction:异步函数,用于获取数据。
  • cacheKey:唯一字符串,用于存储和检索缓存数据。
  • model:默认模型实例,用于反序列化缓存数据。
  • cacheDuration:(可选)缓存有效期。如果不提供,则认为缓存一直有效。
  • forceRefresh:(可选)如果为 true,则忽略缓存并获取新数据。默认值为 false
  • builder:一个接受获取或缓存数据的构建器函数,返回一个 Widget

示例

CachedFutureWidget<MyModel>(
  fetchFunction: () async {
    await Future.delayed(Duration(seconds: 2));
    return MyModel(name: 'John Doe', age: 30);
  },
  cacheKey: 'my_model_data',
  model: MyModel(name: '', age: 0),
  cacheDuration: Duration(minutes: 10),
  forceRefresh: false,
  builder: (context, data) {
    return Text('姓名: ${data.name}, 年龄: ${data.age}');
  },
)

测试

要运行测试:

flutter test

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

1 回复

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


当然,以下是如何在Flutter中使用cached_future_builder插件来实现异步数据缓存与构建的示例代码。

首先,确保你已经将cached_future_builder添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  cached_future_builder: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例,展示如何使用CachedFutureBuilder来缓存和构建异步数据:

import 'package:flutter/material.dart';
import 'package:cached_future_builder/cached_future_builder.dart';
import 'package:flutter/services.dart' show rootBundle;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cached Future Builder Example'),
        ),
        body: Center(
          child: MyDataWidget(),
        ),
      ),
    );
  }
}

class MyDataWidget extends StatelessWidget {
  // 模拟一个异步数据获取函数,例如从网络或本地文件获取数据
  Future<String> fetchData() async {
    // 本地文件读取示例(你可以替换为网络请求)
    return await rootBundle.loadString('assets/sample_data.txt');
  }

  @override
  Widget build(BuildContext context) {
    return CachedFutureBuilder<String>(
      future: fetchData(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          return Text('Data: ${snapshot.data}');
        }
      },
      // 设置缓存时长,例如缓存5分钟
      duration: Duration(minutes: 5),
    );
  }
}

解释

  1. 依赖导入:首先,确保你已经将cached_future_builder添加到你的依赖中。

  2. 主应用MyApp是一个简单的Flutter应用,包含一个Scaffold和一个居中的MyDataWidget

  3. 数据获取函数fetchData函数模拟了一个异步数据获取过程,这里使用本地文件读取作为示例。你可以替换为实际的网络请求。

  4. CachedFutureBuilder

    • future: 传入你的异步数据获取函数。
    • builder: 构建器函数,根据连接状态(等待、完成、错误)返回不同的Widget。
    • duration: 设置缓存时长。在这个例子中,数据将被缓存5分钟。

缓存机制

CachedFutureBuilder内部使用了一个缓存机制,如果在缓存有效期内再次构建Widget,它将直接返回缓存的数据而不是重新执行future函数。这可以显著提升性能,特别是当数据不频繁变化时。

希望这个示例能够帮助你理解如何在Flutter中使用cached_future_builder来实现异步数据缓存与构建。

回到顶部