首页布局的设计与实现

今天是我们开始实际开发"爱影家"APP的第一天!老师说要从首页开始构建,包含轮播图和电影列表两个主要部分。听到要动手做完整功能了,我既兴奋又紧张,毕竟这是我第一次在鸿蒙平台上开发真实的应用功能。

首先是布局设计。老师建议我们使用Flex布局来构建整体框架,这让我想起了前端开发中的Flexbox。我们把首页分为上下两部分:上面是轮播图区域,下面是电影列表。为了让布局更清晰,我创建了两个独立的组件:BannerComponentMovieListComponent,然后在首页主组件中引入它们。

@Component
struct HomePage {
  build() {
    Column() {
      // 轮播图组件
      BannerComponent()
      
      // 电影列表组件
      MovieListComponent()
    }
    .width('100%')
  }
}

轮播图实现的坎坷路

轮播图的实现过程可真是一波三折啊!一开始我直接使用了Swiper组件,以为很简单,结果运行后发现图片加载非常慢,而且滑动不流畅。老师检查了我的代码后指出,我没有使用懒加载,每次都是一次性加载所有图片,这会导致性能问题。

老师给我讲解了IDataSource接口和LazyForEach组件的用法,让我实现一个自定义的数据源。这个过程有点复杂,我反复看了好几次示例代码才理解。特别是registerDataChangeListenernotifyDataReload这些方法的作用,一开始真的有点摸不着头脑。

class BannerDataSource extends BasicDataSource<BannerItem> {
  private dataArray: BannerItem[] = [];
  
  pushData(data: BannerItem): void {
    this.dataArray.push(data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }
}

修改后的代码使用了LazyForEach来渲染轮播图,性能提升了不少。不过我又遇到了图片缓存的问题,每次打开应用都会重新加载图片。后来在同学的提醒下,我给Image组件添加了cache属性,设置为true,这样图片就会被缓存下来,提升了下次加载的速度。

电影列表的性能优化

电影列表的实现也不轻松。一开始我使用ForEach来渲染所有电影卡片,当电影数量比较多时,界面卡顿得很厉害。老师建议我使用List组件配合ListItem,因为List组件有虚拟化功能,只会渲染可视区域内的元素。

List() {
  LazyForEach(this.movieDataSource, (item: Movie) => {
    ListItem() {
      MovieCard({ movie: item })
    }
  }, (item: Movie) => item.id)
}

这个改动让列表滑动变得流畅多了!另外,老师还教我们实现了下拉刷新和上拉加载更多的功能。下拉刷新比较简单,只需要给List组件添加onRefresh事件监听即可。但上拉加载更多我就犯了难,不知道怎么判断用户是否滑动到了列表底部。

后来我查了文档,发现可以使用List组件的onReachEnd事件。当用户滑动到列表末尾时,这个事件会被触发,我们就可以在回调函数中加载更多数据了。这个功能实现后,整个首页的体验好了很多,感觉和真正的商业应用越来越接近了。

调试过程中的小技巧

在开发过程中,我发现了一些调试的小技巧,想分享给大家:

  1. 使用console.log()打印关键信息,帮助定位问题
  2. 利用DevEco Studio的Preview功能,可以快速预览UI效果,不用每次都运行模拟器
  3. 遇到布局问题时,可以临时给组件添加背景色,这样能更清晰地看到组件的边界

今天我还学会了使用远程真机调试功能。当模拟器运行缓慢时,可以连接真实的鸿蒙设备进行调试,速度快了很多,而且能更真实地体验应用效果。

今日总结

通过今天的实践,我深刻体会到了理论和实践的差距。很多东西看起来简单,但实际开发中会遇到各种意想不到的问题。不过解决问题的过程也是学习成长的过程。

现在我的首页轮播图和电影列表已经基本实现了,虽然还有一些细节需要优化,比如图片加载时的占位符、错误处理等,但整体功能已经可以正常使用了。明天我们要开始学习网络请求部分,希望能顺利实现从服务器获取真实的电影数据。

今天虽然很累,但看到自己亲手开发的界面一点点成型,那种成就感是无法用言语形容的!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐