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

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

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

Progressive Image 是一个Flutter小部件,它通过低质量图像占位符(Low Quality Image Placeholders)逐步加载大图。以下是该插件的主要特点、安装步骤以及如何使用的详细说明。

特点 Features

  • 在目标图片加载完成前显示占位符和缩略图。
  • 平滑淡入动画,防止图片加载完成时突然弹出。
  • 低分辨率缩略图的模糊效果,避免像素化视图。
  • 在开始获取目标图片之前有效解析缩略图,以快速形成第一印象。
  • v2.0.0 起支持添加占位符Widget,而不仅仅是图片。

安装 Installing

要将此库作为依赖项添加到您的Flutter项目中,请按照以下步骤操作:

  1. 打开项目的根目录下的 pubspec.yaml 文件,添加如下依赖:

    dependencies:
      progressive_image: ^2.0.0
    
  2. 运行命令来获取包:

    $ flutter packages get
    
  3. 在Dart文件中导入包:

    import 'package:progressive_image/progressive_image.dart';
    

使用 Usage

下面是一个简单的例子,展示了如何使用 ProgressiveImage 小部件:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Progressive Image Example')),
        body: ProgressiveImageExample(),
      ),
    );
  }
}

class ProgressiveImageExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: ProgressiveImage(
        placeholder: AssetImage('assets/placeholder.jpg'), // 占位符图片
        thumbnail: NetworkImage('https://i.imgur.com/7XL923M.jpg'), // 缩略图 URL
        image: NetworkImage('https://i.imgur.com/xVS07vQ.jpg'), // 目标图片 URL
        height: 300,
        width: 500,
      ),
    );
  }
}

此外,还提供了更复杂的用法示例,例如结合不同的占位符类型(如GIF或自定义Widget),以及调整图片适应模式等高级功能。下面是几个不同的实例代码片段:

示例1:带有占位符图片

Widget get example1 => ProgressiveImage(
      placeholder: AssetImage('assets/images/placeholder.jpg'),
      thumbnail: NetworkImage('https://i.imgur.com/eOQL4jg.jpg'), // 64x36
      image: NetworkImage('https://i.imgur.com/mDQ3Qbi.jpg'), // 3842x2160
      height: 250,
      width: 500,
      fit: BoxFit.cover,
    );

示例2:带有占位符GIF

Widget get example2 => ProgressiveImage.assetNetwork(
      placeholder: 'assets/images/placeholder.gif',
      thumbnail: 'https://i.imgur.com/7XL923M.jpg', // 64x43
      image: 'https://i.imgur.com/xVS07vQ.jpg', // 3240x2160
      height: 250,
      width: 500,
      fit: BoxFit.cover,
    );

示例3:使用透明图片作为占位符

Widget get example3 => ProgressiveImage.memoryNetwork(
      placeholder: kTransparentImage,
      thumbnail: 'https://i.imgur.com/zzlvBm5.jpg', // 64x43
      image: 'https://i.imgur.com/7LxOVQf.jpg', // 3240x2160
      height: 250,
      width: 500,
    );

示例4:带有自定义占位符Widget

Widget get example4 => ProgressiveImage.custom(
      placeholderBuilder: (BuildContext context) => _customWidget,
      thumbnail: NetworkImage('https://i.imgur.com/4WRfwXm.jpg'), // 64x43
      image: NetworkImage('https://i.imgur.com/0NnZINx.jpg'), // 3240x2160
      height: 250,
      width: 500,
      fit: BoxFit.cover,
    );

Widget get _customWidget => Container(
      width: 500,
      height: 250,
      color: Color(0xFF6501E5),
      child: Center(
        child: Text(
          "Custom Placeholder",
          style: TextStyle(fontSize: 16, color: Colors.white),
        ),
      ),
    );

这些例子展示了如何根据需求灵活配置 ProgressiveImage 小部件,从而实现更加丰富和个性化的用户体验。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用progressive_image插件实现渐进式加载图片的示例代码。这个插件允许你在图片加载过程中先显示一个低分辨率的预览图(占位图),然后逐渐加载高分辨率的图片,从而提升用户体验。

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

dependencies:
  flutter:
    sdk: flutter
  progressive_image: ^2.0.0  # 请检查最新版本号

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

接下来,在你的Dart文件中,你可以按照以下方式使用ProgressiveImage

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Progressive Image Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Progressive Image Example'),
        ),
        body: Center(
          child: ProgressiveImage.(memory
            placeholder: kTransparentImage, // 占位图(低分辨率图片),可以是Base64编码的图片
            image: kHighQualityImage,       // 高分辨率图片,可以是Base64编码的图片或者URL
            duration: Duration(seconds: 2), // 占位图显示时间,可以根据需要调整
            onErrorWidget: (context, url, error) => Icon(Icons.error), // 错误处理
            onLoadStart: () {
              // 图片开始加载时的回调
              print('Loading started');
            },
            onLoadEnd: (duration) {
              // 图片加载完成时的回调
              print('Loading ended in ${duration.inMilliseconds}ms');
            },
            progressIndicator: (context, downloadProgress) =>
                CircularProgressIndicator(value: downloadProgress), // 自定义加载进度指示器
          ),
        ),
      ),
    );
  }
}

// 示例占位图和高分辨率图片(这里使用Base64编码的透明图片和示例图片URL,你可以替换为实际的图片数据)
const String kTransparentImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkQAIWWHwVMQoAAAAJcYlFNAAAAAABJRRU5ErkJggg==';
const String kHighQualityImage = 'https://example.com/path/to/your/high-quality-image.jpg';

在这个示例中:

  • placeholder 是一个低分辨率的占位图,这里使用了一个Base64编码的透明图片作为示例。
  • image 是高分辨率图片的路径或Base64编码。
  • duration 是在加载高分辨率图片之前占位图显示的时间。
  • onErrorWidget 是在加载图片发生错误时显示的组件。
  • onLoadStartonLoadEnd 分别是图片开始加载和加载完成时的回调。
  • progressIndicator 是一个自定义的加载进度指示器,这里使用了CircularProgressIndicator

你可以根据自己的需求调整这些参数,并使用实际的图片路径替换示例中的图片路径。这样,你就可以在Flutter应用中实现渐进式加载图片了。

回到顶部