解决白屏问题(没有进行rnInstance注册):

在这里插入图片描述

import {
  RNApp,
  RNOHErrorDialog,
  RNOHLogger,
  RNOHCoreContext,
  RNInstance,
  ResourceJSBundleProvider
} from '@rnoh/react-native-openharmony';
import { RNInstanceManager } from "../rn/RNInstanceManager";
import { buildCustomRNComponent } from "../rn/CustomRNComponent";

const wrappedCustomRNComponentBuilder = wrapBuilder(buildCustomRNComponent);

@Entry
@Component
struct Hotel {
  @StorageLink('RNOHCoreContext') private rnohCoreContext: RNOHCoreContext | undefined = undefined;
  @State shouldShow: boolean = false;
  private logger!: RNOHLogger;
  private rnInstance: RNInstance | undefined;

  async aboutToAppear() {
    this.logger = this.rnohCoreContext!.logger.clone("Hotel");
    const stopTracing = this.logger.clone("aboutToAppear").startTracing();
    this.rnInstance = await RNInstanceManager.getInstance("Hotel");
    this.shouldShow = true;
    stopTracing();
  }

  onBackPress(): boolean | undefined {
    this.rnohCoreContext!.dispatchBackPress();
    return true;
  }

  build() {
    Column() {
      if (this.rnohCoreContext && this.shouldShow) {
        if (this.rnohCoreContext?.isDebugModeEnabled) {
          RNOHErrorDialog({ ctx: this.rnohCoreContext });
        }
        RNApp({
          rnInstanceConfig: {
            rnInstance: this.rnInstance as RNInstance,
          },
          initialProps: { "foo": "bar" } as Record<string, string>,
          appKey: "login",
          wrappedCustomRNComponentBuilder: wrappedCustomRNComponentBuilder,
          onSetUp: (rnInstance) => {
            rnInstance.enableFeatureFlag("ENABLE_RN_INSTANCE_CLEAN_UP")
          },
          jsBundleProvider: new ResourceJSBundleProvider(
            this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle/cp/login.harmony.bundle')
        })
      }
    }
    .height('100%')
    .width('100%')
  }
}

这个 Hotel 组件采用了完整的组件化架构,使用 @Entry 装饰器标识为页面级入口,@Component 装饰器定义自定义组件结构。这种设计不仅提高了代码的可读性和维护性,还为应用的长期演进奠定了坚实的技术基础。

在状态管理方面,组件使用了 @StorageLink 和 @State 两种不同的装饰器。@StorageLink 用于与 AppStorage 中的全局状态建立双向绑定,确保不同页面间的状态同步。@State 则用于管理组件内部的局部状态,当状态变化时会自动触发 UI 重新渲染,实现了数据与视图的自动同步。

组件的生命周期管理通过 aboutToAppear 方法实现,这是一个异步函数,在组件即将显示时被调用。函数内部首先初始化日志记录器,通过克隆核心上下文中的日志器并添加 Hotel 标签,实现了精细化的日志追踪。性能追踪机制通过 startTracing 和 stopTracing 方法包装关键操作,帮助开发者识别性能瓶颈。

在 UI 构建系统中,组件采用 Column 垂直布局容器,内部通过条件渲染逻辑确保只有在上下文准备完成且组件应该显示时才渲染 RNApp 组件。这种设计避免了资源竞争和初始化顺序问题。

物理返回键处理通过 onBackPress 方法实现,该方法拦截系统返回键事件并转发给 React Native 上下文处理,返回 true 表示已消费该事件,阻止默认的返回行为。

RNApp 组件的配置包含了完整的参数设置,包括 React Native 实例配置、初始化属性、应用键值、自定义组件构建器以及 JavaScript Bundle 提供器。这种配置化设计使得组件具有极高的灵活性和扩展性。

在这里插入图片描述

错误处理机制在调试模式下通过 RNOHErrorDialog 组件提供友好的错误信息展示。这种设计不仅提高了开发效率,还为应用的稳定运行提供了保障。

ResourceJSBundleProvider 负责从鸿蒙应用的资源管理器中读取和提供 JS Bundle 文件。它通过 uiAbilityContext.resourceManager 获取应用资源,然后加载指定路径的 Bundle 文件。

这种混合开发架构特别适合大型商业应用,如酒店预订平台、电商系统等需要同时追求性能与开发效率的场景。

通过这种架构设计,开发者可以在享受 React Native 丰富生态的同时,充分利用 OpenHarmony 的原生能力,实现最佳的用户体验。

组件的整体设计体现了现代软件工程的先进理念,通过模块化、配置化和声明式编程,构建出既美观又实用的移动应用界面。


实际处理方案:

在这里插入图片描述
接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。
在这里插入图片描述
最终实现效果是:请添加图片描述

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

Logo

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

更多推荐