Flutter数据缓存插件flutter_cache的使用

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

Flutter数据缓存插件flutter_cache的使用

flutter_cache 是一个简单的Flutter缓存插件,它封装了SharedPreferences,使得使用SharedPreferences更加便捷。以下是该插件的基本使用方法和示例代码。

安装

首先,在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter_cache: ^0.0.7

然后运行以下命令来安装包:

flutter pub get

最后在Dart代码中导入该库:

import 'package:flutter_cache/flutter_cache.dart' as cache;

功能概述

  1. 缓存 String, Map, List<String>List<Map> 数据,可以是永久缓存或限时缓存。
  2. 加载已缓存的数据。
  3. 清除所有缓存。
  4. 清除单个缓存项。

使用方法

从API获取并缓存数据

如果数据已经存在,则会使用缓存中的数据;如果不存在,则会重新请求数据。您还可以设置缓存的有效期,以便您的应用程序在缓存过期时重新获取数据。

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter_cache/flutter_cache.dart' as cache;

void fetchAndCacheData() async {
  var employees = await cache.remember('employees', () async {
    var response = await http.get(Uri.parse('http://dummy.restapiexample.com/api/v1/employees'));
    return jsonDecode(response.body)['data'].cast<Map>();
  }, 120); // 缓存2分钟
}

设置有限时间的缓存

您可以为缓存设置有效期,到期后数据将被销毁。

cache.remember('key', 'data', 120); // 保存2分钟或120秒
cache.write('key', 'data', 120);

缓存多种类型的数据

您可以缓存多种类型的值。目前支持的数据类型有 String, Map, List<String>, 和 List<Map>。当您使用 cache.load() 方法加载数据时,它将以原始数据类型返回。

cache.remember('key', { 
  'name': 'Ashraf Kamarudin',
  'depth2': {
    'name': 'depth2',
    'depth3': {'name': 'depth3'}
  }
});

var data = cache.load('key'); // 返回map类型的数据

示例Demo

下面是一个完整的示例程序,展示了如何使用 flutter_cache 插件进行数据缓存。

import 'package:flutter/material.dart';
import 'package:flutter_cache/flutter_cache.dart' as cache;
import 'dart:convert';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Cache Example')),
        body: Center(child: FutureBuilder(
          future: fetchData(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text('Cached Data: ${snapshot.data}');
              }
            } else {
              return CircularProgressIndicator();
            }
          },
        )),
      ),
    );
  }

  Future<String> fetchData() async {
    // 尝试从缓存中加载数据
    var cachedData = await cache.load('employees', 'No cached data');

    if (cachedData == 'No cached data') {
      // 如果没有缓存,则从API获取数据并缓存
      var response = await http.get(Uri.parse('http://dummy.restapiexample.com/api/v1/employees'));
      var data = jsonDecode(response.body)['data'].cast<Map>();

      await cache.remember('employees', data, 120); // 缓存2分钟
      return data.toString();
    } else {
      // 如果有缓存,则直接使用缓存数据
      return cachedData.toString();
    }
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_cache_manager插件来实现数据缓存的示例代码。flutter_cache_manager是一个强大的Flutter插件,它可以帮助你缓存文件(如图片、视频等)并管理这些缓存文件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_cache_manager: ^3.0.3  # 请检查最新版本号

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

接下来,你可以在你的Dart文件中使用flutter_cache_manager。以下是一个简单的示例,展示了如何缓存并获取图片:

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

void main() {
  // 初始化默认配置
  Config config = await DefaultCacheManager().getConfig();
  config.maxCacheSize = 100 * 1024 * 1024; // 设置最大缓存大小为100MB
  config.secureStorage = true; // 启用安全存储(可选)
  await DefaultCacheManager().updateConfig(config);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Cache Manager Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CacheDemo(),
    );
  }
}

class CacheDemo extends StatefulWidget {
  @override
  _CacheDemoState createState() => _CacheDemoState();
}

class _CacheDemoState extends State<CacheDemo> {
  Future<File> _imageFile;

  @override
  void initState() {
    super.initState();
    _imageFile = _fetchAndCacheImage('https://example.com/path/to/image.jpg');
  }

  Future<File> _fetchAndCacheImage(String url) async {
    try {
      File file = await DefaultCacheManager().getSingleFile(url);
      return file;
    } catch (error) {
      print("Error fetching and caching image: $error");
      rethrow;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Cache Manager Demo'),
      ),
      body: Center(
        child: FutureBuilder<File>(
          future: _imageFile,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error loading image: ${snapshot.error}');
              } else if (snapshot.data != null) {
                return Image.file(snapshot.data!);
              }
            }
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

在这个示例中,我们首先初始化了flutter_cache_manager的配置,设置了最大缓存大小和是否启用安全存储。然后,我们在CacheDemo组件中定义了一个_fetchAndCacheImage函数,该函数接受一个URL并返回一个File对象,这个对象是从缓存中获取的或者是从网络上下载并缓存的。

build方法中,我们使用FutureBuilder来异步加载并显示图片。如果图片已经缓存或者成功下载,它将显示图片;否则,它将显示一个进度指示器。

这个示例展示了基本的图片缓存功能,但flutter_cache_manager还支持更多的高级功能,如自定义缓存策略、清理缓存等。你可以根据项目的需求进一步配置和使用它。

回到顶部