Flutter图片渐进式加载与缓存CDN插件progressive_cached_network_image_cdn的使用

Flutter 图片渐进式加载与缓存 CDN 插件 progressive_cached_network_image_cdn 的使用

Progressive Cached Network Image CDN

通过 cached_network_image 加载图片,并使用 ImageCDN 在服务器端调整大小。

你也可以使用 ProgressiveCachedNetworkImage 来加载渐进式图片,通过先加载小尺寸的图片并在原始图片加载完成之前显示占位符。

该插件基于 cached_network_image 插件扩展而来。

ImageCDN

你可以通过以下方法转换图片的 URL:

/// 返回 String
String ImageCDN.convertUrl(String imageUrl, {
  int? width, 
  int? height, 
  ImageCDNFit fit = ImageCDNFit.contain, 
  ImageCDNFormat format = ImageCDNFormat.webp
}) 

CachedNetworkImageCDN

这是一个基于 CachedNetworkImage 的扩展,意味着你可以使用所有与该部件相关的参数:

/// 可以使用这些参数来调整图像的大小
CachedNetworkImageCDN(
    "IMAGE_URL",
    this.resizerFormat = ImageCDNFormat.webp,
    this.resizerFit = ImageCDNFit.contain,
    this.resizerWidth,
    this.resizerHeight,
),

ProgressiveCachedNetworkImage

这是基于 CachedNetworkImageCDN 的扩展,意味着你可以使用所有与该部件相关的参数:

/// 可以使用这些参数来自定义由 ImageCDN 提供的渐进式占位符
ProgressiveCachedNetworkImage(
    "IMAGE_URL", 
    this.progressivePlaceholder,
    this.progressiveBlur = 2,
    this.progressiveErrorPlaceholder,
    this.progressiveResizeHeight,
    this.progressiveResizeWidth,
    this.progressiveResizerFit = ImageCDNFit.contain,
    this.progressiveResizerFormat = ImageCDNFormat.webp,
)

扩展

你可以直接通过添加以下代码来调整 CachedNetworkImage 的图像大小:

/// 确保已经导入插件
import 'package:progressive_cached_network_image_cdn/progressive_cached_network_image_cdn.dart';

CachedNetworkImage( ... ).resizeImage(
        width: width,
        height: height,
        fit: fit,
        format: format,
    )

示例代码

以下是完整的示例代码:

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

void main() {
  runApp(const MaterialApp(
    title: "Example of ProgressiveCachedNetworkImageCDN",
    home: Example(),
  ));
}

class Example extends StatelessWidget {
  const Example({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Image Network Resizer')),
      body: ListView(
        padding: const EdgeInsets.all(10),
        children: [
          Text(
              "所有这些图片的 URL 都是 1024x1024,我们以 10x10 像素的方式加载它们作为渐进式图片",
              style: Theme.of(context).textTheme.headline6),
          const Divider(),
          Wrap(
            spacing: 20,
            runSpacing: 20,
            alignment: WrapAlignment.spaceBetween,
            children: List.generate(
              10,
              (index) => Container(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: Colors.grey.shade100),
                width: MediaQuery.of(context).size.width / 2 - 20,
                height: 200,
                child: ProgressiveCachedNetworkImage(
                  "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4EsXijhrg5-qcNei4DmxwpfifVpYX_nTTYWvrJmcFOkBZhZbyf5noPM3YKeGNPJEnC6YJksq7w_ZJbRJrC7JvtYi5ytdcwpCARY-MfoMX43uSifDaP9Jglq-rHt1pKylz86qTVjzEUXKOtfYjYKd7JujTc9Szqy_-R4xXYs_odsg2bh5zOJc0N5pw/w1024/IMG_3044.jpeg?timestamp=${DateTime.now().millisecondsSinceEpoch}$index",
                  fit: BoxFit.cover,
                  progressiveResizeHeight: 10,
                  progressiveResizeWidth: 10,
                ),
              ),
            ),
          ),
          const SizedBox(height: 30),

          /// 这个图像是 2048x2048,转换为 512x512
          Text("所有这些图片的 URL 都是 1024x1024,但我们将它们转换为 512x512",
              style: Theme.of(context).textTheme.headline6),
          const Divider(),
          Wrap(
            spacing: 20,
            runSpacing: 20,
            alignment: WrapAlignment.spaceBetween,
            children: List.generate(
              10,
              (index) => Container(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: Colors.grey.shade100),
                width: MediaQuery.of(context).size.width / 2 - 20,
                height: 200,
                child: CachedNetworkImageCDN(
                  "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4EsXijhrg5-qcNei4DmxwpfifVpYX_nTTYWvrJmcFOkBZhZbyf5noPM3YKeGNPJEnC6YJksq7w_ZJbRJrC7JvtYi5ytdcwpCARY-MfoMX43uSifDaP9Jglq-rHt1pKylz86qTVjzEUXKOtfYjYKd7JujTc9Szqy_-R4xXYs_odsg2bh5zOJc0N5pw/w1024/IMG_3044.jpeg?timestamp=${DateTime.now().millisecondsSinceEpoch}",
                  resizerHeight: 512,
                  resizerWidth: 512,
                ),
              ),
            ),
          ),

          /// 使用 CacheNetworkImage 扩展来调整图像大小
          CachedNetworkImage(
            imageUrl:
                "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4EsXijhrg5-qcNei4DmxwpfifVpYX_nTTYWvrJmcFOkBZhZbyf5noPM3YKeGNPJEnC6YJksq7w_ZJbRJrC7JvtYi5ytdcwpCARY-MfoMX43uSifDaP9Jglq-rHt1pKylz86qTVjzEUXKOtfYjYKd7JujTc9Szqy_-R4xXYs_odsg2bh5zOJc0N5pw/w1024/IMG_3044.jpeg?timestamp=${DateTime.now().millisecondsSinceEpoch}",
          ).resizeImage(
            width: 120,
          ),

          const SizedBox(height: 50),
          Text(
              "所有图片的版权归图片所有者所有",
              style: Theme.of(context).textTheme.caption,
              textAlign: TextAlign.center),
          Text("由 @nizwar 制作",
              style: Theme.of(context).textTheme.caption,
              textAlign: TextAlign.center),
        ],
      ),
    );
  }
}

更多关于Flutter图片渐进式加载与缓存CDN插件progressive_cached_network_image_cdn的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在 Flutter 中,progressive_cached_network_image_cdn 是一个用于实现渐进式图片加载和缓存(支持 CDN)的插件。它基于 cached_network_image,并增加了对渐进式加载和 CDN 优化的支持。以下是该插件的使用方法和关键点:


1. 添加依赖

pubspec.yaml 中添加依赖:

dependencies:
  progressive_cached_network_image_cdn: ^1.0.0

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


2. 基本用法

渐进式图片加载

import 'package:progressive_cached_network_image_cdn/progressive_cached_network_image_cdn.dart';

ProgressiveCachedNetworkImageCdn(
  imageUrl: 'https://example.com/image.jpg',
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
  fit: BoxFit.cover,
);

CDN 支持

如果需要从 CDN 加载图片,可以直接传递 CDN URL:

ProgressiveCachedNetworkImageCdn(
  imageUrl: 'https://cdn.example.com/image.jpg',
  fit: BoxFit.cover,
);

3. 配置选项

ProgressiveCachedNetworkImageCdn 提供了丰富的配置选项,以下是一些常用参数:

  • imageUrl: 图片的 URL(支持 HTTP/HTTPS 和 CDN)。
  • placeholder: 图片加载时的占位组件。
  • errorWidget: 图片加载失败时显示的组件。
  • fit: 图片的填充方式(如 BoxFit.coverBoxFit.contain)。
  • heightwidth: 自定义图片的高度和宽度。
  • cacheManager: 自定义缓存管理器(需要实现 CacheManager)。
  • progressIndicatorBuilder: 加载进度指示器。
  • alignment: 图片的对齐方式(如 Alignment.center)。
  • colorcolorBlendMode: 图片的颜色和混合模式。
  • filterQuality: 图片的滤镜质量(如 FilterQuality.high)。

4. 自定义缓存

如果需要自定义缓存策略,可以实现 CacheManager,并通过 cacheManager 参数传入:

import 'package:flutter_cache_manager/flutter_cache_manager.dart';

final customCacheManager = CacheManager(
  Config(
    'customCacheKey',
    stalePeriod: Duration(days: 7),
    maxNrOfCacheObjects: 100,
  ),
);

ProgressiveCachedNetworkImageCdn(
  imageUrl: 'https://example.com/image.jpg',
  cacheManager: customCacheManager,
);

5. 示例代码

以下是一个完整示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Progressive Image Example')),
        body: Center(
          child: ProgressiveCachedNetworkImageCdn(
            imageUrl: 'https://example.com/image.jpg',
            placeholder: (context, url) => CircularProgressIndicator(),
            errorWidget: (context, url, error) => Icon(Icons.error),
            fit: BoxFit.cover,
          ),
        ),
      ),
    );
  }
}
回到顶部