Flutter渐进式加载图片插件flutter_progressive_image的使用

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

Flutter渐进式加载图片插件flutter_progressive_image的使用

简介

flutter_progressive_image 是一个用于 Flutter 的渐进式图片加载插件。它允许你在图片加载过程中显示低质量的预览图,从而提升用户体验。

版本信息

  • pub package
  • GitHub stars
  • GitHub forks
  • GitHub license
  • GitHub issues

预览

渐进式加载 普通加载
progressive_image general_image
📺 渐进式加载演示视频 📺 普通加载演示视频

支持的图片格式

  • ✅ jpeg/jpg
  • ❌ png
  • ❌ gif

使用方法

添加依赖

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_progressive_image: ^0.0.5

基本用法

Image(
  image: ProgressiveImage(url),
)

支持的参数

参数 是否可选 描述
url 必需 图片 URL
headers 可选 HTTP 头
imageLoader 可选 低级别的图片加载器

注意:默认的 imageLoader 不支持持久化缓存。

示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_progressive_image 插件来实现渐进式图片加载,并显示加载进度。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_progressive_image/flutter_progressive_image.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final url =
      'https://raw.githubusercontent.com/fingerart/flutter_progressive_image/main/arts/example_progressive_image.jpg';

  double? progress;

  @override
  void initState() {
    super.initState();
    _startListenProgress();
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Progressive image example'),
        ),
        body: Column(
          children: [
            const SizedBox(height: 15),
            Expanded(
              child: Image(
                image: ProgressiveImage(url),
                frameBuilder: _buildFrameBuilder,
                errorBuilder: _buildImageError,
              ),
            ),
            SizedBox(
              width: double.infinity,
              child: Padding(
                padding: const EdgeInsets.symmetric(vertical: 10),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.end,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    SizedBox.square(
                      dimension: 20,
                      child: CircularProgressIndicator(
                        value: progress,
                        strokeWidth: 2,
                      ),
                    ),
                    const SizedBox(height: 5),
                    Text(
                      'Loading: ${((progress ?? 0) * 100).toInt()}%',
                    )
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildImageError(
    BuildContext context,
    Object error,
    StackTrace? stackTrace,
  ) {
    debugPrint(error.toString());
    debugPrintStack(stackTrace: stackTrace);
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        const Icon(Icons.image_not_supported_outlined),
        const SizedBox(height: 5),
        Text(error.toString(), style: const TextStyle(color: Colors.red))
      ],
    );
  }

  Widget _buildFrameBuilder(
    BuildContext context,
    Widget child,
    int? frame,
    bool wasSynchronouslyLoaded,
  ) {
    return frame == null
        ? const Center(
            child: CircularProgressIndicator(strokeWidth: 2),
          )
        : child;
  }

  void _startListenProgress() {
    var streamListener = ImageStreamListener(
      (image, synchronousCall) {},
      onChunk: (event) {
        if (event.expectedTotalBytes != null) {
          setState(() {
            progress = event.cumulativeBytesLoaded / event.expectedTotalBytes!;
          });
        }
      },
    );
    ProgressiveImage(url)
        .resolve(ImageConfiguration.empty)
        .addListener(streamListener);
  }
}

说明

  1. 初始化:在 initState 方法中调用 _startListenProgress 方法,开始监听图片加载进度。
  2. 构建 UI:使用 Image 小部件加载渐进式图片,并通过 frameBuildererrorBuilder 回调处理图片加载过程中的帧构建和错误处理。
  3. 显示进度:在底部显示一个 CircularProgressIndicator 和加载进度文本。

通过以上步骤,你可以轻松地在 Flutter 应用中实现渐进式图片加载,并提升用户体验。


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

1 回复

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


当然,下面是一个关于如何使用 flutter_progressive_image 插件在 Flutter 中实现渐进式加载图片的示例代码。这个插件允许你先加载一个模糊的低分辨率预览图片,然后逐渐加载高清图片,从而提供更好的用户体验。

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

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

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 ProgressiveImage 小部件。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Progressive Image Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Progressive Image Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // 使用 ProgressiveImage 小部件
              ProgressiveImage.memoryNetwork(
                previewImage: 'https://via.placeholder.com/300x200/0000FF/FFFFFF?text=Preview', // 预览图片URL
                placeholder: CircularProgressIndicator(), // 占位符,在加载预览图片时使用
                errorWidget: Icon(Icons.error), // 加载失败时显示的组件
                image: 'https://via.placeholder.com/300x200/FF0000/FFFFFF?text=HighRes', // 高清图片URL
                imageSemanticsLabel: 'A high resolution image', // 图片语义标签,用于无障碍访问
                fadeInDuration: Duration(milliseconds: 500), // 高清图片淡入动画时长
                fit: BoxFit.cover, // 图片适应方式
              ),
              SizedBox(height: 20),
              Text(
                'Scroll down to see more images load progressively.',
                style: TextStyle(fontSize: 18),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们使用了 ProgressiveImage.memoryNetwork 方法来加载网络图片。你需要提供两个 URL:一个是低分辨率的预览图片 URL (previewImage),另一个是高清图片的 URL (image)。此外,你还可以自定义占位符 (placeholder)、加载失败时显示的组件 (errorWidget)、高清图片淡入动画时长 (fadeInDuration) 以及图片适应方式 (fit)。

当你运行这个应用时,你会看到一个占位符指示器(例如一个圆形的进度条),随后是一个模糊的低分辨率预览图片,最终加载高清图片并淡入显示。

这个插件非常适合用于需要加载大量图片的场景,例如瀑布流布局或图片画廊,可以显著提升用户体验。

回到顶部