基于华为鸿蒙OpenHarmony与React Native深度集成的详情页面组件,展示了在现代跨平台移动应用开发中如何实现复杂的混合渲染架构、状态管理和组件通信机制。从技术架构的宏观层面来看,这段代码构建了一个完整的详情业务模块,通过声明式UI编程范式实现了原生组件与React Native组件的无缝融合。

在代码结构方面,首先导入了RNInstance核心类,这是React Native在鸿蒙平台上的实例管理对象。从本地模块导入BaseRN和LoadManager,BaseRN是基础的React Native渲染组件,LoadManager负责RN实例的加载和管理。MetroBaseRN是专门用于Metro开发服务器环境的渲染组件,这种设计体现了对不同运行环境的全面考虑。


Metro服务

​ 本工程实现了Metro加载bundle包服务,请根据工程运行指导的说明启动Metro服务,您可以在修改React Native侧的代码后保存,即可实时刷新App界面内容。详细介绍可以参考Metro

请添加图片描述

reload和logbox

​ 需要在业务侧进行处理,详见rnoh/src/main/ets/RNApp.ets

关于Release版本

本次发版新增了一个release版本的har包,命名为rnoh_release.har。跟rnoh.har(我们称为debug版本)相比,主要的区别如下:
大小:release版本中我们将C++源码转换成了二进制so文件,因此大小明显小了很多
应用构建速度:由于做了预编译,引用release版本的har包,主应用的构建速度会明显加快
功能:release版本去除了调试功能,因此想用JS断点调试的话建议先使用debug版本
用法:release版本的使用方法跟debug版本小有区别,详见如下:

Release版本用法跟创建鸿蒙工程这一节基本上是一致的,唯一的区别点是<加载har包>这一节中【替换entry文件夹内容】时需要将MyApplicationReplace/entry/src/main/cpp/CMakeLists - release.txt文件重命名为CMakeLists.txt。

CMakeLists - release.txt与原CMakeLists.txt的区别详见CMakeLists - release.txt里的注释说明。

注意:

  1. 如果出现CMake报错先确认是否该文件是否是最新版
  2. 如果出现inclue文件报错先确认rnoh.har是否是最新版请添加图片描述

@Component装饰器声明这是一个自定义组件结构,export default struct Details定义了详情模块的主组件。这种基于结构体的组件定义方式是鸿蒙ArkTS语言的特色,提供了更好的类型安全和运行时性能。装饰器模式的使用是现代前端框架的重要特征,它通过元数据注解的方式增强了类的功能。

组件内部定义了private instance: RNInstance = LoadManager.bpInstance,通过LoadManager获取业务详情页面的RN实例。这种实例管理机制确保了资源的有效利用和性能的优化。

bundlePath设置为’bundle/bp/details.harmony.bundle’,这是详情模块的bundle文件路径,体现了项目的模块化组织结构。moduleName设置为’Details’,标识了模块的唯一名称,这种命名规范有助于代码的组织和维护。

@State name: string = ""定义了一个响应式状态变量,用于管理页面名称。这种状态管理机制确保了UI的响应性和数据的一致性。

import { RNInstance } from '@rnoh/react-native-openharmony';
import { BaseRN, LoadManager } from '../rn';
import { MetroBaseRN } from '../rn/MetroBaseRN';

@Component
export default struct Details {
  private instance: RNInstance = LoadManager.bpInstance;
  private bundlePath = 'bundle/bp/details.harmony.bundle';
  private moduleName = 'Details';
  @State name: string = "";
  @StorageLink('isMetroAvailable') isMetroAvailable: boolean = false;
  private container: Record<string, string | number> = {
    "backgroundColor": '#E6E6E6',
    "flex": 1,
    "padding": 20,
  }
  private apiFontSize: Record<string, string | number> = {
    'fontSize': 30,
    'color': 'white'
  }
  private styles: Record<string, object> = {
    'container': this.container,
    'apiFontSize': this.apiFontSize
  }
  private initProps: Record<string, string | object> = {
    // 'stringParam': 'ArkTS传递给RN的参数',
    // 'styles' : this.styles
  };

  aboutToAppear() {
    this.initProps = {
      'stringParam': 'ArkTS传递给RN的参数:' + this.name,
      'styles': this.styles
    };
  }

  build() {
    NavDestination() {
      Column() {
        Text(this.name)
          .fontSize(30)
          .fontWeight(30)
          .margin({ top: 10 })
        Row() {
          Text('紫色区域及文字ArkTS渲染')
            .fontSize(30)
            .fontColor('white')
            .fontWeight(20)
        }
        .height(100)
        .width('90%')
        .margin({ top: 10 })
        .backgroundColor('#a0a0ff')
        .borderRadius(10)

        if (this.isMetroAvailable) {
          MetroBaseRN({
            moduleName: this.moduleName,
            initProps: this.initProps as Record<string, string>
          }).align(Alignment.Top).margin({ top: 20 })
        } else if (this.instance) {
          BaseRN({
            rnInstance: this.instance,
            moduleName: this.moduleName,
            bundlePath: this.bundlePath,
            initProps: this.initProps as Record<string, string>
          }).align(Alignment.Top).margin({ top: 20 })
        }
      }.align(Alignment.Top).margin({ top: 40 })
    }
    .hideTitleBar(true)
  }
}

@StorageLink(‘isMetroAvailable’) isMetroAvailable: boolean = false创建了一个与AppStorage双向绑定的状态变量,用于检测Metro开发服务器是否可用。这种全局状态管理方式在复杂应用中尤为重要。

container对象定义了容器的样式属性,包括浅灰色背景、弹性布局为1和20像素的内边距。这些样式设置共同创建了一个视觉上舒适、布局合理的显示环境。

apiFontSize对象定义了API字体样式,包括30像素的字体大小和白色字体颜色。这种样式定义方式提供了良好的可读性和可维护性。

styles对象将container和apiFontSize样式组织在一起,形成了一个完整的样式系统。这种样式组织结构在现代前端开发中非常常见。

initProps对象是一个记录类型,用于存储传递给React Native组件的初始化属性。这种属性传递机制确保了跨平台组件间数据的一致性。

aboutToAppear生命周期函数在组件即将显示时执行。在这个函数中,重新初始化initProps对象,设置stringParam为"ArkTS传递给RN的参数:"加上当前名称,以及完整的样式对象。这种动态属性设置机制为组件提供了灵活性。

build函数定义了组件的UI结构。使用NavDestination组件创建导航目标容器,隐藏标题栏以提供更沉浸式的用户体验。

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐