Flutter图片加载与显示插件octo_image的使用

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

Flutter图片加载与显示插件octo_image的使用

OctoImage

pub package Build Status codecov

OctoImage 是一个用于显示占位符、错误部件并转换图像的库。推荐与 CachedNetworkImage 版本 2.2.0 或更新版本一起使用。

快速开始

OctoImage 需要一个 ImageProvider 来显示图像。你可以提供占位符或进度指示器、ImageBuilder 和/或错误部件。或者,可以使用预定义的组合 OctoSet

自定义所有组件

OctoImage(
  image: CachedNetworkImageProvider('https://blurha.sh/assets/images/img1.jpg'),
  placeholderBuilder: OctoPlaceholder.blurHash(
    'LEHV6nWB2yk8pyo0adR*.7kCMdnj',
  ),
  errorBuilder: OctoError.icon(color: Colors.red),
  fit: BoxFit.cover,
);

使用 OctoSet

OctoImage.fromSet(
  fit: BoxFit.cover,
  image: CachedNetworkImageProvider(
    'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Macaca_nigra_self-portrait_large.jpg/1024px-Macaca_nigra_self-portrait_large.jpg',
  ),
  octoSet: OctoSet.circleAvatar(
    backgroundColor: Colors.red,
    text: Text("M"),
  ),
);

ImageProviders

推荐使用 CachedNetworkImageProvider,因为它支持进度指示器、错误处理和缓存,并且在 Android、iOS、Web 和 macOS 上工作良好(Web 上不支持缓存)。确保使用至少 2.2.0 版本。

其他 ImageProvider 也可以使用,但对于某些 ImageProvider(如 MemoryImage),使用 OctoImage 没有意义。

占位符和进度指示器

最好只使用占位符或进度指示器之一,但不要同时使用两者。占位符仅在图像开始加载时构建一次,而进度指示器每次收到新的进度信息时都会重建。

最简单的进度指示器是 CircularProgressIndicator

OctoImage(
  image: image,
  progressIndicatorBuilder: (context) => const CircularProgressIndicator(),
),

使用预构建的进度指示器:

OctoImage(
  image: image,
  progressIndicatorBuilder: OctoProgressIndicator.circularProgressIndicator(),
),

包括的所有占位符和进度指示器:

OctoPlaceholder Explanation
blurHash 显示 BlurHash 图像
circleAvatar 显示带文本的彩色圆圈
circularProgressIndicator 显示不确定进度的圆形进度条
frame 显示 Flutter 占位符
OctoProgressIndicator Explanation
circularProgressIndicator 显示简单的 CircularProgressIndicator

错误部件

ImageProvider 抛出错误时显示错误部件。你可以构建自定义部件或使用预构建部件:

OctoImage(
  image: image,
  errorBuilder: (context, error, stacktrace) => const Icon(Icons.error),
);

使用预构建的错误部件:

OctoImage(
  image: image,
  errorBuilder: OctoError.icon(),
);

包括的所有错误部件:

OctoError Explanation
blurHash 显示带有错误图标的 BlurHash 占位符
circleAvatar 显示带文本的彩色圆圈
icon 显示图标,默认为 Icons.error
placeholderWithErrorIcon 显示带有图标的任何占位符

图像构建器

图像构建器可以在显示之前调整图像。例如,将图像裁剪成圆形,或添加覆盖层等。

示例:以 50% 的不透明度显示图像:

OctoImage(
  image: image,
  imageBuilder: (context, child) => Opacity(
    opacity: 0.5,
    child: child,
  ),
);

使用预构建的图像转换器裁剪图像为圆形:

OctoImage(
  image: image,
  imageBuilder: OctoImageTransformer.circleAvatar(),
);

包括的所有图像转换器:

OctoImageTransformer Explanation
circleAvatar 将图像裁剪为圆形

OctoSets

使用 OctoSet 可以获得最佳效果。这些集合包含占位符或进度指示器、图像构建器和/或错误部件构建器的组合。始终至少包含占位符或进度指示器和错误部件。

使用 OctoImage.fromSet

OctoImage.fromSet(
  image: image,
  octoSet: OctoSet.circleAvatar(backgroundColor: Colors.red, text: Text("M")),
);

包括的所有 OctoSet:

OctoSet Explanation
circleAvatar 加载和错误期间显示带文本的彩色圆圈。成功加载后裁剪图像为圆形
circularIndicatorAndIcon 显示带或不带进度的圆形进度条和错误时的图标

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'OctoImage Demo',
      theme: ThemeData(),
      home: const OctoImagePage(),
    );
  }
}

class OctoImagePage extends StatelessWidget {
  const OctoImagePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('OctoImage Demo'),
      ),
      body: ListView(
        children: [
          _customImage(),
          const SizedBox(height: 16),
          _circleAvatar(),
        ],
      ),
    );
  }

  Widget _customImage() {
    return SizedBox(
      height: 150,
      child: OctoImage(
        image: const NetworkImage('https://via.placeholder.com/150'),
        progressIndicatorBuilder: (context, progress) {
          double? value;
          var expectedBytes = progress?.expectedTotalBytes;
          if (progress != null && expectedBytes != null) {
            value = progress.cumulativeBytesLoaded / expectedBytes;
          }
          return CircularProgressIndicator(value: value);
        },
        errorBuilder: (context, error, stacktrace) => const Icon(Icons.error),
      ),
    );
  }

  Widget _circleAvatar() {
    return SizedBox(
      height: 75,
      child: OctoImage.fromSet(
        fit: BoxFit.cover,
        image: const NetworkImage(
          'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Macaca_nigra_self-portrait_large.jpg/1024px-Macaca_nigra_self-portrait_large.jpg',
        ),
        octoSet: OctoSet.circleAvatar(
          backgroundColor: Colors.red,
          text: const Text("M"),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中,octo_image 是一个强大的图片加载与显示插件,它提供了高效的图片缓存和加载功能,支持占位符、加载错误处理等特性。以下是如何在Flutter项目中使用 octo_image 的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  octo_image: ^latest_version  # 替换为最新版本号

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

2. 导入包

在你的 Dart 文件中导入 octo_image 包:

import 'package:octo_image/octo_image.dart';

3. 使用 OctoImage 组件

下面是一个使用 OctoImage 组件加载和显示图片的完整示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('OctoImage Example'),
        ),
        body: Center(
          child: OctoImage.network(
            'https://example.com/path/to/your/image.jpg',  // 替换为你的图片URL
            placeholder: Image.asset('assets/placeholder.png'),  // 占位符图片,确保在assets文件夹中有这张图片
            errorWidget: (context, error, stackTrace) {
              return Icon(
                Icons.error_outline,
                color: Colors.red,
                size: 64,
              );
            },
            loadingWidget: CircularProgressIndicator(),  // 加载中的Widget
            fit: BoxFit.cover,  // 图片适应模式
          ),
        ),
      ),
    );
  }
}

4. 本地图片加载示例

如果你需要加载本地图片,可以使用 OctoImage.asset 方法:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('OctoImage Local Example'),
        ),
        body: Center(
          child: OctoImage.asset(
            'assets/your_local_image.png',  // 替换为你的本地图片路径
            placeholder: Image.asset('assets/placeholder.png'),  // 占位符图片
            errorWidget: (context, error, stackTrace) {
              return Icon(
                Icons.error_outline,
                color: Colors.red,
                size: 64,
              );
            },
            loadingWidget: CircularProgressIndicator(),  // 加载中的Widget
            fit: BoxFit.cover,  // 图片适应模式
          ),
        ),
      ),
    );
  }
}

5. 配置缓存

octo_image 提供了丰富的缓存配置选项。你可以在 OctoImage 的初始化时进行配置:

OctoImageConfig config = OctoImageConfig(
  memoryCacheConfig: MemoryCacheConfig(
    maxSizeBytes: 10 * 1024 * 1024,  // 内存缓存大小
  ),
  diskCacheConfig: DiskCacheConfig(
    baseDirectory: 'octo_image_cache',  // 磁盘缓存目录
    maxSize: 100 * 1024 * 1024,  // 磁盘缓存大小
  ),
);

// 在MaterialApp或更高层次的组件中设置全局配置
OctoImage.init(config);

这样,你就完成了在Flutter项目中集成和使用 octo_image 插件来加载和显示图片。注意,实际使用时,请根据你的具体需求调整配置和参数。

回到顶部