Flutter渐进式加载图片插件flutter_progressive_image的使用
Flutter渐进式加载图片插件flutter_progressive_image的使用
简介
flutter_progressive_image
是一个用于 Flutter 的渐进式图片加载插件。它允许你在图片加载过程中显示低质量的预览图,从而提升用户体验。
版本信息
预览
渐进式加载 | 普通加载 |
---|---|
📺 渐进式加载演示视频 | 📺 普通加载演示视频 |
支持的图片格式
- ✅ 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);
}
}
说明
- 初始化:在
initState
方法中调用_startListenProgress
方法,开始监听图片加载进度。 - 构建 UI:使用
Image
小部件加载渐进式图片,并通过frameBuilder
和errorBuilder
回调处理图片加载过程中的帧构建和错误处理。 - 显示进度:在底部显示一个
CircularProgressIndicator
和加载进度文本。
通过以上步骤,你可以轻松地在 Flutter 应用中实现渐进式图片加载,并提升用户体验。
更多关于Flutter渐进式加载图片插件flutter_progressive_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
)。
当你运行这个应用时,你会看到一个占位符指示器(例如一个圆形的进度条),随后是一个模糊的低分辨率预览图片,最终加载高清图片并淡入显示。
这个插件非常适合用于需要加载大量图片的场景,例如瀑布流布局或图片画廊,可以显著提升用户体验。