Flutter图片缓存管理插件flutter_cache_manager的使用

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

Flutter图片缓存管理插件flutter_cache_manager的使用

简介

flutter_cache_manager 是一个用于下载和缓存文件到应用程序缓存目录的库。它提供了多种设置来控制文件在缓存中的保留时间,并利用 HTTP 缓存控制头(Cache-Control)高效地获取文件。

主要功能

  • 缓存文件:通过 getSingleFilegetFileStream 等方法从网络下载并缓存文件。
  • 自定义配置:允许用户根据需求调整缓存策略,如最大缓存对象数量、文件过期时间等。
  • 图像处理:提供 ImageCacheManager 混入,支持按指定尺寸缩放图像后存储于缓存中。

使用方法

基本用法

获取单个文件

var file = await DefaultCacheManager().getSingleFile(url);

此代码段将尝试从缓存中读取文件;如果不存在,则会从给定 URL 下载文件并将其保存到本地缓存中。

获取文件流

Stream<FileResponse> stream = DefaultCacheManager().getFileStream(url, withProgress: true);

使用 getFileStream 方法可以获取一个包含缓存文件和新下载文件(如果有)的流。设置 withProgress 参数为 true 可以接收下载进度信息。

直接下载文件

await DefaultCacheManager().downloadFile(url);

该方法直接从互联网下载文件而不检查缓存。

仅从缓存中获取文件

var cachedFile = await DefaultCacheManager().getFileFromCache(url);
if (cachedFile == null) {
  // 文件不在缓存中
}

添加文件到缓存

await DefaultCacheManager().putFile(filePath);

这允许手动将本地文件添加到缓存系统中。

移除或清空缓存

// 移除特定文件
await DefaultCacheManager().removeFile(url);

// 清空所有缓存文件
await DefaultCacheManager().emptyCache();

图像缓存管理

对于图像资源,可以通过 ImageCacheManager 提供的 getImageFile 方法进行特殊处理:

Stream<FileResponse> imageStream = DefaultCacheManager().getImageFile(
  url,
  maxHeight: 200,
  maxWidth: 300,
);

这样不仅可以缓存原始图像,还能根据需要调整大小后再缓存,从而节省存储空间。

自定义配置

为了满足更复杂的业务逻辑,你可以创建自己的 CacheManager 实例并配置不同的参数:

class CustomCacheManager {
  static const key = 'customCacheKey';
  static CacheManager instance = CacheManager(
    Config(
      key,
      stalePeriod: Duration(days: 7),
      maxNrOfCacheObjects: 20,
      repo: JsonCacheInfoRepository(databaseName: key),
      fileSystem: IOFileSystem(key),
      fileService: HttpFileService(),
    ),
  );
}

注意:确保每个 CacheManagerkey 是唯一的,避免多个实例之间产生冲突。

示例代码

以下是一个完整的示例应用,展示了如何结合上述功能在一个简单的页面中实现文件下载与缓存管理:

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

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

const url = 'https://picsum.photos/200/300';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CacheManagerPage(),
    );
  }
}

class CacheManagerPage extends StatefulWidget {
  @override
  _CacheManagerPageState createState() => _CacheManagerPageState();
}

class _CacheManagerPageState extends State<CacheManagerPage> {
  Stream<FileResponse>? fileStream;

  void _downloadFile() async {
    setState(() {
      fileStream = DefaultCacheManager().getFileStream(url, withProgress: true);
    });
  }

  void _clearCache() async {
    await DefaultCacheManager().emptyCache();
    setState(() {
      fileStream = null;
    });
  }

  void _removeFile() async {
    await DefaultCacheManager().removeFile(url);
    setState(() {
      fileStream = null;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter Cache Manager Example')),
      body: Center(
        child: fileStream == null
            ? ElevatedButton(
                onPressed: _downloadFile,
                child: Text('Download Image'),
              )
            : StreamBuilder<FileResponse>(
                stream: fileStream!,
                builder: (context, snapshot) {
                  if (!snapshot.hasData || snapshot.data == null) {
                    return CircularProgressIndicator();
                  } else {
                    final file = snapshot.data!.file;
                    return Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Image.file(file),
                        SizedBox(height: 20),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: [
                            ElevatedButton(onPressed: _removeFile, child: Text('Remove File')),
                            ElevatedButton(onPressed: _clearCache, child: Text('Clear Cache')),
                          ],
                        ),
                      ],
                    );
                  }
                },
              ),
      ),
    );
  }
}

这个例子演示了如何使用 flutter_cache_manager 插件来管理和显示远程图片,并提供了清除缓存和移除单个文件的功能按钮。希望这段代码能够帮助你更好地理解和应用这个强大的工具!


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

1 回复

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


当然,下面是一个关于如何使用Flutter图片缓存管理插件flutter_cache_manager的示例代码。这个插件允许你缓存从网络上获取的图片,并在之后的请求中直接从缓存中加载这些图片,以提高应用的性能和用户体验。

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

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

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

接下来是一个简单的使用示例:

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

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

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

class CacheManagerDemo extends StatefulWidget {
  @override
  _CacheManagerDemoState createState() => _CacheManagerDemoState();
}

class _CacheManagerDemoState extends State<CacheManagerDemo> {
  final DefaultCacheManager _cacheManager = DefaultCacheManager();

  @override
  void initState() {
    super.initState();
    // 可以在这里预加载图片到缓存中
    _preloadImages();
  }

  Future<void> _preloadImages() async {
    final List<String> imageUrls = [
      'https://example.com/image1.jpg',
      'https://example.com/image2.jpg',
      // 添加更多图片URL
    ];

    for (final String url in imageUrls) {
      try {
        await _cacheManager.getFile(url);
      } catch (e) {
        print('Failed to preload image: $url');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Cache Manager Demo'),
      ),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          crossAxisSpacing: 4.0,
          mainAxisSpacing: 4.0,
        ),
        itemCount: 5, // 假设我们展示5张图片
        itemBuilder: (context, index) {
          final String imageUrl = 'https://example.com/image${index + 1}.jpg';
          return CachedNetworkImage(
            imageUrl: imageUrl,
            placeholder: (context, url) => CircularProgressIndicator(),
            errorWidget: (context, url, error) => Icon(Icons.error),
          );
        },
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 依赖添加:在pubspec.yaml中添加flutter_cache_managercached_network_image依赖。cached_network_image是基于flutter_cache_manager的一个更高层次的封装,用于直接从缓存中加载和显示图片。

  2. 初始化CacheManager:在_CacheManagerDemoState中,我们创建了一个DefaultCacheManager实例。

  3. 预加载图片:在initState方法中,我们预加载了一些图片到缓存中。这可以加快之后的图片加载速度。

  4. 显示图片:使用CachedNetworkImage组件来显示图片。这个组件会自动处理图片的缓存和加载。

这样,你的Flutter应用就能够高效地管理图片缓存,提高性能和用户体验。

回到顶部