Flutter for OpenHarmony 实战:flutter_image — 增强型图片加载与缓存

Flutter中的Image入门讲解,诚意分享 图片大小小于容器事相当于none,图片大小大于容器时缩小图片大小实现contain [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwmPWjKZ-1650620786670)(https://user-gold-cdn.xitu.io/2018/12/12/167a08fa8c45a8e1?imageView2/0/w/1280/h/960/ignore-error/1)] centerSlice属性专门用于nine-patch文件。 其他属性暂时不讲。 一般情况下这个控 阅读详情

Flutter for OpenHarmony 实战:flutter_image — 增强型图片加载与缓存

前言

在移动应用开发中,图片加载是极其常见的场景。虽然 Flutter 原生的 Image.network 已经非常易用,但在网络环境不稳定的情况下(如若网、断网重连),原生的加载方式往往缺乏自动重试机制,导致用户体验不佳。

flutter_image 是由 Flutter 官方团队维护的一个实用库,它提供了一些增强的图片提供者(Image Provider),其中最核心的就是 NetworkImageWithRetry。它能够自动处理网络请求失败的情况并进行指数退避重试,非常适合 OpenHarmony 应用在复杂网络环境下的图片展示。

本文将介绍如何在 OpenHarmony 上安装和使用 flutter_image,并重点讲解权限配置。

一、核心功能

1.1 NetworkImageWithRetry

这是该库的主力功能。当图片下载失败时,它不会立即报错,而是会尝试重新下载。重试策略通常是指数级的(例如等待 1秒、2秒、4秒…),直到成功或达到最大重试次数。

1.2 FadeInImage 的完美搭档

虽然 Flutter 自带 FadeInImage,但结合 NetworkImageWithRetry 可以确保即使图片首次加载失败,用户也能在重试成功后平滑地看到图片,而不是一直对着占位图。

二、安装与配置

2.1 添加依赖

在 pubspec.yaml 中添加:

dependencies:
  flutter:
    sdk: flutter
  # 请检查 pub.dev 获取最新版本
  flutter_image: ^4.1.0
dependency_overrides:
  flutter_image:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "packages/flutter_image"

在这里插入图片描述

2.2 OpenHarmony 权限配置(关键)

⚠️ 注意:这是 OpenHarmony 开发中最容易被忽略的一步。默认情况下,应用没有访问互联网的权限。如果缺少此配置,所有网络图片都将加载失败!

请确保 entry/src/main/module.json5 文件中包含 ohos.permission.INTERNET:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
  }
}

在这里插入图片描述

三、基础用法

3.1 使用 NetworkImageWithRetry

将原生的 NetworkImage 替换为 NetworkImageWithRetry 即可:

import 'package:flutter/material.dart';
import 'package:flutter_image/network.dart'; // 必须导入此文件

class ImageRetryPage extends StatelessWidget {
  const ImageRetryPage({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('自动重试图片加载')),
      body: Center(
        child: Image(
          image: NetworkImageWithRetry(
            'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg',
            // 可选:自定义 fetch 策略,通常默认即可
          ),
          width: 300,
          height: 300,
          fit: BoxFit.cover,
        ),
      ),
    );
  }
}

3.2 结合 Avatar 使用

该库还经常用于头像显示,因为它能很好地处理加载过程中的占位。

CircleAvatar(
  radius: 50,
  backgroundImage: NetworkImageWithRetry(
    'https://example.com/user_avatar.jpg',
  ),
  onBackgroundImageError: (exception, stackTrace) {
    // 即使重试多次后依然失败,可以在这里处理
    print('图片彻底加载失败');
  },
  child: const Icon(Icons.person), // 加载失败或加载中显示的图标
)

四、OpenHarmony 平台适配与最佳实践

4.1 缓存策略说明

需要注意的是,flutter_image 主要侧重于 加载机制(重试),而不是 持久化缓存。在 OpenHarmony 上,如果你的应用需要将大量图片缓存到本地磁盘(Disk Cache),以便下次冷启动时无需联网即可显示,建议配合 cached_network_image 使用,或者自行实现本地文件缓存逻辑。

OpenHarmony 的文件系统路径(通过 path_provider 获取)完全支持 Dart 的 File 操作,因此标准的文件缓存方案是通用的。

4.2 内存优化

OpenHarmony 设备形态多样,从低功耗设备到高性能手机。在加载高清大图时,务必指定 cacheWidth 或 cacheHeight(如果使用 ResizeImage),或者确保服务器返回适当分辨率的图片,避免 ImageCache 占用过多内存导致 OOM(内存溢出)。

Image(
  image: ResizeImage(
    NetworkImageWithRetry('https://large-image-url.jpg'),
    width: 200, // 仅解码为显示宽度的尺寸
  ),
)

五、完整示例代码

这个示例展示了一个图片网格,模拟了从网络加载多张图片的效果。

import 'package:flutter/material.dart';
import 'package:flutter_image/network.dart';

class FlutterImageDemo extends StatelessWidget {
  const FlutterImageDemo({super.key});

  // 模拟一组图片 URL
  final List<String> _imageUrls = const [
    'https://picsum.photos/200/300?random=1',
    'https://picsum.photos/200/300?random=2',
    'https://picsum.photos/200/300?random=3',
    'https://picsum.photos/200/300?random=4',
    // 一个可能不存在的 URL 来测试重试 (实际情况需关闭网络测试)
    'https://httpbin.org/image/jpeg',
  ];

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter Image Demo')),
      body: GridView.builder(
        padding: const EdgeInsets.all(8),
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          mainAxisSpacing: 8,
          crossAxisSpacing: 8,
          childAspectRatio: 0.7,
        ),
        itemCount: _imageUrls.length,
        itemBuilder: (context, index) {
          return Card(
            clipBehavior: Clip.antiAlias,
            elevation: 4,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Expanded(
                  child: Image(
                    image: NetworkImageWithRetry(_imageUrls[index]),
                    fit: BoxFit.cover,
                    loadingBuilder: (ctx, child, progress) {
                      if (progress == null) return child;
                      return Center(
                        child: CircularProgressIndicator(
                          value: progress.expectedTotalBytes != null
                              ? progress.cumulativeBytesLoaded /
                                  progress.expectedTotalBytes!
                              : null,
                        ),
                      );
                    },
                    errorBuilder: (ctx, error, stack) {
                      return const Center(child: Icon(Icons.broken_image, size: 40, color: Colors.grey));
                    },
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text('Image ${index + 1}', textAlign: TextAlign.center),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

在这里插入图片描述

六、总结

flutter_image 以最小的成本解决了网络抖动导致的图片加载失败问题。在 OpenHarmony 应用开发中,结合正确的权限配置(ohos.permission.INTERNET),它能显著提升应用的健壮性。

虽然界面上看不出太大的区别,但这种“隐形”的优化对于提升用户留存率至关重要。


🌐 欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区

Flutter 网络图片的缓存和加载 大家在开发过程中又的时候需要展示网络图片,这个时候大多数开发直接通过系统的Image直接展示就完事了,但是由于我的这个项目图片有类似于朋友圈的功能,图片可以无限制的上传,如果用户数量很庞大,同事加载图片的展示,读服务器的带宽要求非常高。 那我们如何合理的解决这个问题呢,就是图片的缓存,这个缓存不是说临时的缓存,可以说是下载,缓存当我们把APP后台杀死后还是会重新再次加载图片,只是起到一个临时混存的作用,这样做没有起到很大的作用。 我们要求的是,只要APP打开,这个图片只要请求一下,以后只要在此使用这个图 阅读详情

相关推荐

Flutter 加载Https网络图片

在开发过程中,我们经常会加载网络图片,Flutter 其实已经为我们提供了网络图片的加载方法,我们只需要使用即可。 例如: Container( //展示动态图片 margin: EdgeInsets.fromLTRB(0, 10, 50, 10), width: 80, height: 80, decoration: BoxDecoration( image: Decora

WangQingLei0307的博客 1562

Flutter Image库详细介绍与使用指南

在Flutter中,图片是应用程序中不可或缺的一部分,而image库是一个强大而灵活的图片加载和处理库。通过使用,您可以轻松地实现图片的加载、缓存、调整大小和裁剪等功能,同时还支持各种图片格式。通过使用库,您可以轻松地实现在Flutter应用程序中加载和处理图片的功能。该库提供了丰富的功能,包括调整大小、裁剪、旋转等,同时还支持各种图片格式。在开发过程中,结合高级用法,如在内存中处理图片和使用缓存,可以提高应用程序的性能。

爱喝水程序员的博客 2008

Flutter中网络图片加载和缓存的实现

主要介绍了Flutter中网络图片加载和缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Flutter图片压缩库对比

在Flutter应用程序开发中,图片压缩是一个非常重要的话题。在本文中,我们将比较一些常用的Flutter图片压缩库,以便您可以选择适合您应用程序的最佳选项。该库是Flutter官方推荐的图片压缩库之一。它支持JPEG和PNG格式的图片压缩,可以在iOS和Android平台上使用。此外,flutter_image_compress还支持将图片转换为WebP格式。image是一个功能强大的库,可以在Flutter应用程序中进行图像处理,包括图片压缩。

weixin_43740011的博客 2076

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4185

IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍

IAR 一般是指一款嵌入式软件的集成开发环境,类似于 MDK-Keil 这款软件。IAR 对于不同的内核处理器,是对应不同的 IAR 软件的,IAR 到目前为止支持大部分的MCU,比如8051系列、ARM架构系列、MSP430系列、AVR系列等等这些常用的芯片架构。对于 ARM 架构的芯片,有对应的 IAR Embedded Workbench for ARM 软件平台,因为我主要是使用 ARM 架构芯片,下面安装、注册和使用都是基于这个版本进行介绍的。

luobeihai的博客 6万+

Flutter图片压缩库推荐:flutter_image_compress

`flutter_image_compress` 是一个专为Flutter应用设计的图片压缩库,主要使用Dart语言编写。该库通过原生插件(Obj-C/Kotlin)在Android、iOS、macOS和Web平台上实现高效的图片压缩功能。它不仅支持常见的图片格式如JPEG和PNG,还支持WebP和HEIF(Heic)格式,适用于多种应用场景。 #### 项目核心功能 1. **多平台支持**

gitblog_01211的博客 1330

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 577

强大的 Flutter 图片处理库 —— extended_image 深度使用指南

**extended_image** 是一款专为 Flutter 设计的图像增强库,它基于 Flutter 官方的 Image 组件进行了广泛的扩展,提供了一系列高级功能,满足开发者在处理图片时的各种需求。本指南旨在详细介绍如何安装、使用此库,并深入探讨其核心 API 和特性。 ## 安装指南 ### 对于空安全环境 在您的 `pubspec.yaml` 文件中添加以下依赖: ```yam...

gitblog_01269的博客 2145

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 273

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1970

Flutter - 加载网络图片的几种方式

对很多移动应用来说,加载网络图片是很常见的基本功能。Android中常用Glide等图片库。Flutter提供了Image组件来展示不同类型的图片。 加载网络图片有几种方式: Image.network FadeInImage.memoryNetwork 使用cached_network_image中的CachedNetworkImage 使用Image.network加载图片 根据UR...

油焖茄子 的博客 1万+

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 308

Flutter 三方库 image_picker_plus 鸿蒙适配指南 - 实现多功能图片视频选择、在 OpenHarmony 上打造全能多媒体处理引擎实战

在鸿蒙(OpenHarmony)生态的影音娱乐或社交类 App 开发中,单一的图片选择已无法满足用户日益增长的创作需求。用户不仅需要从相册挑选素材,更希望能在同一个交互流程中完成即时拍摄、视频预览甚至简单的裁剪处理。是一款针对全场景多媒体摄取设计的增强型框架。它将复杂的相机拉起、相册检索与基础编辑逻辑高度集成。本文将为你详解如何在鸿蒙端利用这套方案,构建一个极具工业竞争力的多媒体入口引擎。以其全能的表现,充当了鸿蒙应用与现实物理世界的“多维视觉接口”。它抹平了繁琐的硬件底层差异。

2609_95049439的博客 4536

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2614

yolov5运行detect.py之后卡住了?没后续,没结果,没报错,怎么办?如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1096

Flutter构建OpenHarmony技术博客阅读器实践

跨平台开发框架Flutter凭借其高效的渲染引擎和代码复用能力,正在成为移动应用开发的重要选择。通过Skia图形引擎实现硬件加速渲染,Flutter应用可以获得接近原生的性能表现。在OpenHarmony生态中,Flutter的跨平台特性与鸿蒙分布式能力形成互补优势,特别适合开发需要多端协同的技术工具类应用。本文以技术博客阅读器为例,展示如何利用Flutter实现90%的代码复用率,并深度整合OpenHarmony的分布式数据同步和原子化服务能力。其中涉及的代码高亮解析、多级缓存策略等关键技术,对开发各类内

weixin_30768881的博客 167

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Flutter - Image

Flutter 中,我们可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。

a136447572的专栏 665

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Flutter中的 Image图片组件的详解

介绍: Image 图片组件是用来显示图像的组件,Image 组件有很多构造函数(命名构造函数) 如: Image.file:从文件获取图片 Image.asset: 本地图片 Image.network:从网络加载 Image.memory: 官方介绍截图如下: 以下只对Image.network和Image.asset进行讲解: 一.Image 组件的常用属性 属性名称 类型...

码龙-的博客 2539

flutter图片压缩库对比

flutter_luban方法调用起来也比较简单,先将需要压缩的图片封装到CompressObject类中,然后调用Luban.compressImage既可。);// _path为压缩后图片路径});然后来看下compressImage方法的具体实现}然后就是调用到了_lubanCompress这个方法。从这个方法可以看出,flutter_luban只支持jpg和png格式的图片压缩,然后基本的步骤为图片的宽高进行的一系列的计算和校验。

Dream It Possible 3179

Flutter Image 图片加载

Image 简介 Android ios 原生中使用 ImageView 来加载显示图片 在flutter 中通过Image来加载并显示图片 1 Image 加载网络图片 var imageUrl = "http://pic31.nipic.com/20130711/8952533_164845225000_2.jpg"; Image( image: NetworkImage( ...

代码小疯子 4857

Flutter中网络图片加载和缓存

前言 应用开发中经常会碰到网络图片的加载,通常我们会对图片进行缓存,以便下次加载同一张图片时不用再重新下载,在包含有大量图片的应用中,会大幅提高图片展现速度、提升用户体验且为用户节省流量。Flutter本身提供的Image Widget已经实现了加载网络图片的功能,且具备内存缓存的机制,接下来一起看一下Image的网络图片加载的实现。 重温小部件Image 常用小部件Image中实现了几种构造函数...

weixin_33978044的博客 3068

【Flutter】Flutter 一些常用库

Flutter社区和资源传送门 新:慕课网《Flutter入门与案例实战》 | 中文网《Flutter实战》电子书 字体图标生成http://fluttericon.com/ Flutter中文网https://flutterchina.club Flutter官网https://flutter.io Flutter中文开发者论...

weixin_34367845的博客 1707

Flutter | Image 源码阅读和使用优化

前言 Image 是 Flutter 用于显示图像的小组件,它可以加载网络,本地,文件或者内存中的图像,支持 JPEG、PNG、GIF、动画 GIF、WebP、动画 WebP、BMP 和 WBMP 格式。Flutter Image 本身也实现了内存缓存的机制,可以很大的提高图片展示速度等。 重温 Image 的打开方式 Image.network Image.network("图片地址",fit: BoxFit.cover,width: ,height: 400) Image.file Image

345丶 2395

从零搭建一套 Flutter 架构:先跑通数据流

接手新 Flutter 项目时,应先明确数据真实来源、生命周期、错误处理与入口路径。以“加入购物车”为例,通过单向数据流设计:页面仅负责展示与事件触发,由 Repository 统一管理购物车状态,ViewModel 转换为 UI 状态,实现单一真实来源。按功能聚合目录,优先完成垂直切片——从网络请求到页面渲染的完整链路,再逐步引入依赖注入、缓存与异常处理。架构核心是职责清晰、可测试、易维护,而非堆砌框架。

trebleZ的博客 511
上一篇: Flutter for OpenHarmony 实战:flutter_markdown — 高效渲染 Markdown 文本
下一篇: 构建网络感知应用:Flutter connectivity_plus 在鸿蒙端的流式架构实践
大山哥AGI
博客等级 码龄1年 1万+粉丝 2232原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值