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

1 回复

更多关于Flutter图片加载与扩展功能插件extended_image_http_13_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


extended_image_http_13_forkextended_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', // 自定义缓存键
);
回到顶部