Flutter图片缓存插件adv_image_cache的使用

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

Flutter 图片缓存插件 adv_image_cache 的使用

adv_image_cache 插件用于加载网络图片并应用缓存规则,同时提供方便的缓存管理。以下是该插件的主要功能:

  • 加载网络图片
  • 自定义缓存规则
  • 内存缓存
  • 选择缓存目录名称
  • 失败时使用备用图片
  • 后台缓存更新
  • 强制清除单个缓存项
  • 强制清除所有缓存项

主要类 AdvImageCache 用于图片加载和缓存规则。

缓存管理类 AdvImageCacheMgr 用于清除单个或所有缓存项。

示例代码

import 'package:adv_image_cache/adv_image_cache_mgr.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:adv_image_cache/adv_image_cache.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    // String platformVersion;
    // 平台消息可能会失败,所以我们使用一个 try/catch PlatformException。
    // try {
    //   platformVersion = await AdvImageCache.platformVersion;
    // } on PlatformException {
    //   platformVersion = 'Failed to get platform version.';
    // }

    // 如果在异步平台消息传输过程中,小部件从树中移除,我们需要丢弃回复而不是调用
    // setState 来更新我们的非存在的外观。
    // if (!mounted) return;

    // setState(() {
    //   _platformVersion = platformVersion;
    // });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Column(
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                Center(
                  child: Column(
                    children: [
                      const Text("7天缓存过期"),
                      Image(
                          image: AdvImageCache(
                        "https://picsum.photos/100/160",
                        useMemCache: true,
                        fallbackAssetImage: "assets/img_err.png",
                      )),
                    ],
                  ),
                ),
                Center(
                  child: Column(
                    children: [
                      const Text("0秒缓存过期(总是刷新)"),
                      Image(
                          image: AdvImageCache(
                        "https://picsum.photos/100/150",
                        useMemCache: false,
                        diskCacheExpire: const Duration(seconds: 0),
                      )),
                    ],
                  ),
                ),
              ],
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                Center(
                  child: Column(
                    children: [
                      const Text("加载失败测试"),
                      Image(
                          image: AdvImageCache(
                        "https://picsumaaa.photos/100/170",
                        fallbackAssetImage: "assets/img_err.png",
                      )),
                    ],
                  ),
                ),
                Center(
                  child: Column(
                    children: [
                      const Text("1分钟缓存过期"),
                      Image(
                          image: AdvImageCache(
                        "https://picsum.photos/100/180",
                        useMemCache: true,
                        diskCacheExpire: const Duration(minutes: 1),
                      )),
                    ],
                  ),
                ),
              ],
            ),
            ElevatedButton(onPressed: () => setState(() {}), child: const Text("重新加载并测试缓存规则")),
            ElevatedButton(
                onPressed: () {
                  setState(() {
                    AdvImageCacheMgr().clearItem("https://picsum.photos/100/160");
                  });
                },
                child: const Text("强制清除第一个图片的缓存")),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  AdvImageCacheMgr().clearAllItems();
                });
              },
              child: const Text("强制清除所有缓存项"),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter图片缓存插件adv_image_cache的代码示例。这个插件允许你高效地缓存网络图片,以减少重复加载和提升应用性能。

首先,确保你的Flutter项目中已经添加了adv_image_cache依赖。在你的pubspec.yaml文件中添加以下依赖:

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

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

接下来,让我们看一下如何在Flutter应用中使用adv_image_cache

示例代码

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final AdvImageCache _imageCache = AdvImageCache(
    maxCacheSize: 100, // 最大缓存数量
    maxCacheMemorySize: 50 * 1024 * 1024, // 最大缓存内存大小(字节)
    repo: DiskRepo(cacheDir: 'adv_image_cache'), // 磁盘缓存目录
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AdvImageCache Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CachedNetworkImage(
              imageUrl: 'https://example.com/image.jpg',
              imageProvider: _imageCache,
              placeholder: (context, url) => CircularProgressIndicator(),
              errorWidget: (context, url, error) => Icon(Icons.error),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 手动清理缓存
                await _imageCache.clearCache();
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Cache cleared')),
                );
              },
              child: Text('Clear Cache'),
            ),
          ],
        ),
      ),
    );
  }
}

// 使用CachedNetworkImage组件,该组件需要AdvImageCache实例作为imageProvider
class CachedNetworkImage extends StatelessWidget {
  final String imageUrl;
  final AdvImageCache imageProvider;
  final Widget Function(BuildContext context, String url) placeholder;
  final Widget Function(BuildContext context, String url, Object error) errorWidget;

  CachedNetworkImage({
    required this.imageUrl,
    required this.imageProvider,
    required this.placeholder,
    required this.errorWidget,
  });

  @override
  Widget build(BuildContext context) {
    return FadeInImage.memoryNetwork(
      placeholder: kTransparentImage, // 默认占位符
      image: imageUrl,
      imageProvider: (context, url) async {
        final Uint8List? bytes = await imageProvider.loadImage(url);
        return bytes;
      },
      errorWidget: (context, url, error) => errorWidget!(context, url, error),
      fadeInDuration: Duration(milliseconds: 300),
      fadeInCurve: Curves.easeInOut,
    );
  }
}

说明

  1. 依赖注入:在pubspec.yaml文件中添加adv_image_cache依赖,并运行flutter pub get
  2. 初始化缓存:在_MyHomePageState类中初始化AdvImageCache实例,并配置最大缓存数量和内存大小。
  3. 显示图片:创建一个自定义的CachedNetworkImage组件,该组件使用AdvImageCache实例来加载图片。如果图片加载失败,显示错误图标;如果正在加载,显示占位符。
  4. 清理缓存:添加一个按钮来手动清理缓存,并在清理完成后显示SnackBar通知。

请注意,FadeInImage.memoryNetwork不能直接使用AdvImageCache作为imageProvider,因此我们创建了一个自定义的CachedNetworkImage组件来桥接这一功能。在实际使用中,你可能需要根据具体需求调整这个组件的实现。

希望这个示例代码能帮助你理解如何在Flutter项目中使用adv_image_cache插件进行图片缓存。

回到顶部