HarmonyOS鸿蒙Next中如何使用Image组件加载网络图片并处理加载状态?

HarmonyOS鸿蒙Next中如何使用Image组件加载网络图片并处理加载状态? 我需要显示网络图片,如何处理加载中和加载失败的状态?如何设置占位图?

3 回复

实现思路:

  1. 使用 Image 组件直接加载网络图片 URL:
Image('https://example.com/image.png')
  .width(100)
  .height(100)
  1. 使用 onComplete 和 onError 监听加载状态:
Image(this.imageUrl)
  .onComplete(() => {
    this.isLoaded = true;
  })
  .onError(() => {
    this.loadFailed = true;
  })
  1. 使用 Stack 叠加实现占位图效果:
Stack() {
  if (!this.isLoaded) {
    Image($r('app.media.placeholder')).width('100%').height('100%')
  }
  Image(this.imageUrl)
    .onComplete(() => { this.isLoaded = true; })
}
  1. 完整示例代码:
@Component
struct NetworkImage {
  @Prop src: string = '';
  @Prop width: number = 100;
  @Prop height: number = 100;
  @State isLoaded: boolean = false;
  @State loadFailed: boolean = false;

  build() {
    Stack() {
      // 占位图或错误图
      if (!this.isLoaded || this.loadFailed) {
        Image(this.loadFailed ? $r('app.media.error') : $r('app.media.placeholder'))
          .width(this.width)
          .height(this.height)
          .objectFit(ImageFit.Cover)
      }

      // 网络图片
      if (!this.loadFailed) {
        Image(this.src)
          .width(this.width)
          .height(this.height)
          .objectFit(ImageFit.Cover)
          .opacity(this.isLoaded ? 1 : 0)
          .onComplete(() => {
            this.isLoaded = true;
          })
          .onError(() => {
            this.loadFailed = true;
          })
      }
    }
    .width(this.width)
    .height(this.height)
  }
}

// 使用示例
@Entry
@Component
struct ImageListPage {
  @State imageList: string[] = [
    'https://example.com/image1.png',
    'https://example.com/image2.png',
    'https://example.com/image3.png'
  ];

  build() {
    Column({ space: 12 }) {
      ForEach(this.imageList, (url: string, index: number) => {
        NetworkImage({ src: url, width: 200, height: 150 })
      })
    }
    .width('100%')
    .padding(16)
  }
}

更多关于HarmonyOS鸿蒙Next中如何使用Image组件加载网络图片并处理加载状态?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,使用Image组件加载网络图片并处理加载状态,可通过以下方式实现:

  1. 使用Image组件,并设置src为网络图片URL。
  2. 通过onCompleteonError回调监听加载状态。
  3. 结合状态变量(如@State)控制占位图或错误图的显示。

示例代码片段:

@State isLoaded: boolean = false
@State hasError: boolean = false

Image(this.imageUrl)
  .onComplete(() => {
    this.isLoaded = true
  })
  .onError(() => {
    this.hasError = true
  })

加载过程中可使用条件渲染显示加载指示器,错误时显示备用图片。

在HarmonyOS Next中,使用Image组件加载网络图片并管理加载状态,推荐采用以下方案:

1. 加载网络图片

使用src属性直接设置网络URL即可加载。

Image(src: 'https://example.com/image.jpg')

2. 处理加载状态与占位图

通过Image组件的loadingEffect属性配合状态变量来实现。

示例代码:

import { LoadingProgress } from '@kit.ArkUI';

@Entry
@Component
struct ImageExample {
  @State imageStatus: 'loading' | 'success' | 'failed' = 'loading'
  @State retryCount: number = 0

  build() {
    Column() {
      if (this.imageStatus === 'loading') {
        // 加载中:显示进度指示器
        LoadingProgress()
          .width(50)
          .height(50)
      } else if (this.imageStatus === 'failed') {
        // 加载失败:显示占位图+重试按钮
        Image($r('app.media.placeholder')) // 本地占位图资源
          .width(200)
          .height(200)
        Button('重试')
          .onClick(() => {
            this.retryCount++
            this.loadImage()
          })
      } else {
        // 加载成功:显示网络图片
        Image('https://example.com/image.jpg?v=' + this.retryCount)
          .width(200)
          .height(200)
          .onComplete(() => {
            this.imageStatus = 'success'
          })
          .onError(() => {
            this.imageStatus = 'failed'
          })
      }
    }
  }

  // 图片加载控制函数
  loadImage() {
    this.imageStatus = 'loading'
    // 实际项目中可在此处添加图片预加载逻辑
  }

  aboutToAppear() {
    this.loadImage()
  }
}

3. 关键配置说明

  • onComplete:图片加载成功回调
  • onError:图片加载失败回调
  • loadingEffect:可设置为ImageLoadingEffect.SYNC(同步解码)或ImageLoadingEffect.ASYNC(异步解码)
  • 占位图:使用$r('app.media.xxx')引用resources/base/media/目录下的本地图片资源

4. 高级处理建议

  • 对于频繁加载的图片,建议使用内存缓存机制
  • 可封装自定义NetworkImage组件统一处理加载逻辑
  • 大图加载考虑使用Image.Interpolation设置降级采样

这种方案通过状态驱动UI更新,清晰管理了加载、成功、失败三种状态,并提供了重试机制和占位图显示。

回到顶部