Flutter图片加载与扩展功能插件extended_image_http_13_fork的使用
Flutter图片加载与扩展功能插件extended_image_http_13_fork的使用
简介
extended_image
是一个强大的第三方库,用于扩展 Flutter 的 Image
组件功能。它支持占位符(加载/失败状态)、网络图片缓存、缩放平移图片、照片查看器、滑动退出页面、编辑器(裁剪、旋转、翻转)等功能。
使用步骤
导入依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
extended_image: ^4.0.0
缓存网络图片
简单使用
可以使用 ExtendedImage.network
作为 Image
小部件:
ExtendedImage.network(
url,
width: ScreenUtil.instance.setWidth(400),
height: ScreenUtil.instance.setWidth(400),
fit: BoxFit.fill,
cache: true,
border: Border.all(color: Colors.red, width: 1.0),
shape: BoxShape.circle,
borderRadius: BorderRadius.all(Radius.circular(30.0)),
)
使用 ExtendedNetworkImageProvider
ExtendedNetworkImageProvider(
this.url, {
this.scale = 1.0,
this.headers,
this.cache: false,
this.retries = 3,
this.timeLimit,
this.timeRetry = const Duration(milliseconds: 100),
CancellationToken cancelToken,
}) : assert(url != null),
assert(scale != null),
cancelToken = cancelToken ?? CancellationToken();
参数说明:
参数 | 描述 | 默认值 |
---|---|---|
url | 图片的URL | 必须 |
scale | 放置在 ImageInfo 对象中的比例 |
1.0 |
headers | 用于从网络获取图像时的HTTP头 | - |
cache | 是否将图像缓存到本地 | false |
retries | 请求失败后的重试次数 | 3 |
timeLimit | 请求图像的时间限制 | - |
timeRetry | 每次重试之间的延迟 | 毫秒: 100 |
cancelToken | 取消网络请求的令牌 | CancellationToken() |
加载状态
ExtendedImage
提供了三种状态:加载中、完成、失败。可以通过 loadStateChanged
回调定义自定义状态小部件。
final LoadStateChanged loadStateChanged;
enum LoadState {
loading,
completed,
failed
}
final bool enableLoadState;
示例代码:
ExtendedImage.network(
url,
width: ScreenUtil.instance.setWidth(600),
height: ScreenUtil.instance.setWidth(400),
fit: BoxFit.fill,
cache: true,
loadStateChanged: (ExtendedImageState state) {
switch (state.extendedImageLoadState) {
case LoadState.loading:
_controller.reset();
return Image.asset(
"assets/loading.gif",
fit: BoxFit.fill,
);
break;
case LoadState.completed:
_controller.forward();
return FadeTransition(
opacity: _controller,
child: ExtendedRawImage(
image: state.extendedImageInfo?.image,
width: ScreenUtil.instance.setWidth(600),
height: ScreenUtil.instance.setWidth(400),
),
);
break;
case LoadState.failed:
_controller.reset();
return GestureDetector(
child: Stack(
fit: StackFit.expand,
children: [
Image.asset(
"assets/failed.jpg",
fit: BoxFit.fill,
),
Positioned(
bottom: 0.0,
left: 0.0,
right: 0.0,
child: Text(
"加载图片失败,点击重新加载",
textAlign: TextAlign.center,
),
)
],
),
onTap: () {
state.reLoadImage();
},
);
break;
}
},
)
缩放和平移
ExtendedImage.network(
imageTestUrl,
fit: BoxFit.contain,
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: (state) {
return GestureConfig(
minScale: 0.9,
animationMinScale: 0.7,
maxScale: 3.0,
animationMaxScale: 3.5,
speed: 1.0,
inertialSpeed: 100.0,
initialScale: 1.0,
inPageView: false,
initialAlignment: InitialAlignment.center,
);
},
)
双击动画示例:
onDoubleTap: (ExtendedImageGestureState state) {
var pointerDownPosition = state.pointerDownPosition;
double begin = state.gestureDetails.totalScale;
double end;
_animation?.removeListener(animationListener);
_animationController.stop();
_animationController.reset();
if (begin == doubleTapScales[0]) {
end = doubleTapScales[1];
} else {
end = doubleTapScales[0];
}
animationListener = () {
state.handleDoubleTap(
scale: _animation.value,
doubleTapPosition: pointerDownPosition);
};
_animation = _animationController
.drive(Tween<double>(begin: begin, end: end));
_animation.addListener(animationListener);
_animationController.forward();
},
编辑器
ExtendedImage.network(
imageTestUrl,
fit: BoxFit.contain,
mode: ExtendedImageMode.editor,
extendedImageEditorKey: editorKey,
initEditorConfigHandler: (state) {
return EditorConfig(
maxScale: 8.0,
cropRectPadding: EdgeInsets.all(20.0),
hitTestSize: 20.0,
cropAspectRatio: _aspectRatio.aspectRatio);
},
);
滑动退出页面
ExtendedImageSlidePage(
child: result,
slideAxis: SlideAxis.both,
slideType: SlideType.onlyImage,
onSlidingPage: (state) {
var showSwiper = !state.isSliding;
if (showSwiper != _showSwiper) {
_showSwiper = showSwiper;
rebuildSwiper.add(_showSwiper);
}
},
)
更多关于Flutter图片加载与扩展功能插件extended_image_http_13_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图片加载与扩展功能插件extended_image_http_13_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
extended_image_http_13_fork
是 extended_image
插件的一个分支,专门用于解决 Flutter 中图片加载的问题,尤其是在使用 HttpClient
时的兼容性问题。extended_image
是一个功能强大的图片加载库,支持缓存、缩放、裁剪、加载进度显示等功能。
1. 安装插件
首先,你需要在 pubspec.yaml
文件中添加 extended_image_http_13_fork
依赖:
dependencies:
flutter:
sdk: flutter
extended_image_http_13_fork: ^1.0.0
然后运行 flutter pub get
来安装依赖。
2. 基本使用
使用 ExtendedImage.network
来加载网络图片,extended_image_http_13_fork
会处理 HttpClient
的相关问题。
import 'package:flutter/material.dart';
import 'package:extended_image/extended_image.dart';
import 'package:extended_image_http_13_fork/extended_image_http_13_fork.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Extended Image Example'),
),
body: Center(
child: ExtendedImage.network(
'https://example.com/image.jpg',
cache: true, // 启用缓存
fit: BoxFit.cover,
loadStateChanged: (ExtendedImageState state) {
switch (state.extendedImageLoadState) {
case LoadState.loading:
return CircularProgressIndicator();
case LoadState.completed:
return null;
case LoadState.failed:
return Icon(Icons.error);
}
},
),
),
),
);
}
}
3. 高级功能
extended_image
提供了许多高级功能,比如图片缩放、裁剪、加载进度显示等。
3.1 图片缩放与裁剪
你可以使用 GestureDetector
来实现图片的缩放和裁剪功能。
ExtendedImage.network(
'https://example.com/image.jpg',
mode: ExtendedImageMode.gesture, // 启用手势功能
initGestureConfigHandler: (state) {
return GestureConfig(
inPageView: true, // 是否在 PageView 中
initialScale: 1.0, // 初始缩放比例
minScale: 0.8, // 最小缩放比例
maxScale: 3.0, // 最大缩放比例
);
},
);
3.2 加载进度显示
你可以通过 loadStateChanged
回调来显示加载进度。
ExtendedImage.network(
'https://example.com/image.jpg',
loadStateChanged: (ExtendedImageState state) {
switch (state.extendedImageLoadState) {
case LoadState.loading:
return CircularProgressIndicator();
case LoadState.completed:
return null;
case LoadState.failed:
return Icon(Icons.error);
}
},
);
3.3 自定义缓存策略
你可以通过 ExtendedNetworkImageProvider
来自定义缓存策略。
ExtendedImage.network(
'https://example.com/image.jpg',
cache: true, // 启用缓存
cacheKey: 'custom_cache_key', // 自定义缓存键
);