首页 > 其他分享 >同一套RN代码,运行在原生鸿蒙端结果不一样?

同一套RN代码,运行在原生鸿蒙端结果不一样?

时间:2024-12-09 20:21:31浏览次数:3  
标签:原生 鸿蒙 Metro 代码 bundle RN 加载

一、创作背景

我最近开发鸿蒙的时候碰到一个很奇怪的问题,在这里给大家分享一下。如果后面大家也碰到类似的问题,可以作为修改参考。

二、问题描述

RN鸿蒙端开发的时候,可能碰到调试时和正式发版时展示效果不一致的情况。

我这里有一段最简单的JS代码,只有一个View和一个Text,具体代码如下:

这代码简单得不能再简单了,我们使用npm run dev的方式打出来bundle包,然后在鸿蒙原生这边使用这个bundle包,最后的效果为:

这个效果和我预想中的结果是OK的,接下来咱们换一种运行方式,使用npm run start的方式打开RN服务端,然后使用metro的方式加载这个bundle包。意外出现了,结果如下图:

大家可以很明显的看到,同一套RN代码,在打包后再使用时是正常的,但是使用metro热加载时,上方字体变小了。

这个问题让我也很困惑,在非鸿蒙端运行RN的时候从未碰到过这种问题,于是我请教了鸿蒙的官方技术人员,官方的答复如下:

开发者您好,这边找到之前有遇到过一个类似的问题,是使用了RNAbility的项目,在使用 Metro 服务加载 RN 页面时字体变小,加载本地 bundle 时,字体显示正常。

原因是从5.0.0.500版本新增了 fontSizeScale 参数,对应原生中的 fontSizeScale,表示字体大小缩放比例,取值范围:0~3.2,默认值为1,分析原因后发现都是因为加载 bundle 太早或者说创建 RNInstancesCoordinator 太晚导致的。CPP 侧拿到 fontScale 值是通过 RNInstancesCoordinator 的 fontSizeScale 传递的,如果 RNInstancesCoordinator 创建过晚,提前加载了 RN 页面,CPP 侧渲染时的 fontScale 将为 0,而正常大小值是 1,所以导致了字体显示明显变小。

通过分析这个开发者的代码发现是在 onWindowStageCreate 中执行了预加载 Metro bundle 的操作,加载 Metro 的时候,RNOH 的 CPP 侧还未拿到 RNInstancesCoordinator 传递的 fontScale 默认值,所以出现了 Metro 服务加载的 RN 页面字体变小。解决方案是将预加载 Metro bundle 的代码延迟到首页面中执行。

按照官方的说法,是因为onWindowStageCreate()中预加载了bundle。所以要修复metro调试时字体变小的问题,这里要把onWindowStageCreate()去掉,只保留getPagePath()即可。

三、本文总结

本文中我分享了RN鸿蒙端开发过程中遇到的一个调试的坑点,以最简单DEMO的形式给大家分享出来,并且给出了解决方案,希望对大家有所帮助。文中如果有错误的地方,也希望大家可以指出来一起探讨。

本人后续有空的话会分享更多鸿蒙开发过程中的经验,感兴趣的家人们可以点赞关注一下,第一时间互相学习,一起进步。

 

标签:原生,鸿蒙,Metro,代码,bundle,RN,加载
From: https://www.cnblogs.com/foodie/p/18595968

相关文章

  • 云原生周刊:在 Docker 上部署大语言模型
    开源项目推荐GlanceGlance是一个开源的自托管仪表板,旨在帮助用户将多种信息源集中展示在一个平台上,用户可以通过它查看不同的实时数据和更新。作为自托管解决方案,Glance提供了灵活的定制功能,允许用户根据自己的需求添加或删除不同的源和小部件。OrangePiShellOrangePiShell......
  • 对RNN算法个人觉得理解比较到位的博客摘要,记录一些大佬的博客链接
    题记这篇博客主要记录几个讲的比较不错的博客,方便大家理解RNN系列的优化算法,比如GRU、LSTM等,以及为什么要用,怎么用等问题,我个人读下来是写的比较不错。当然还有一些我觉得比较不错的强化学习方面的博客,也在此浅浅的记录一下。。。正文第一处博客第二处博客这个是PYTORCH的代......
  • 强化学习:基于课程学习的强化学习算法 —— 《Combining Reward Shaping and Curriculu
    地址:https://www.tesble.com/10.1109/ICTC.2018.8539438我们在四种不同的奖励函数和终止条件下对行走者进行了训练,以评估结合奖励塑形和课程学习的效果。具体如下。1)距离稀疏奖励:行走者到达目标时给予1个奖励,否则为0。2)距离课程奖励:给予行走者的奖励与行走者距离稀疏奖励......
  • Tornado Cash:开发者参考手册
    我们的目标是让你了解整个开发周期,而不仅仅是Solidity智能合约。为此,我们将涵盖[1]架构概述,[2]CircomZK电路,[3]智能合约以及[4]客户端的证明生成和验证(使用Javascript)。​TornadoCash于2019年首次推出。自那时以来,ZK工具的发展使得原始仓库有些过时。我们......
  • OpenHarmony默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你轻松取消
    开发板在默认情况下,OpenHarmony系统开机后30秒会自动息屏,自动息屏会让不少用户感到麻烦,触觉智能教大家两招轻松取消自动息屏。使用触觉智能PurplePiOH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新OpenHarmony5.0Release系统,SDK源码全开放!S......
  • 【鸿蒙开发基础】@Styles修饰符
    1.@Styles修饰符是什么?@Styles修饰符用于保存公共属性,公共属性就是给每一个组件都可以设置的属性,比如宽度和高度,或者圆角设置,有些是特殊属性,只能给特定的组件进行设置,比如Text()可以设置的特殊属性有fontStyle和fontWeight。在Row()组件中就无法设置这两个属性,这是Text()所特......
  • 面试官:Java中Class.forName和ClassLoader到底有啥区别?
    最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别。当时没有想出来后来自己研究了一下就写下来记录一下。解释在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类......
  • EtherNetIP转Profinet网关模块profinet通讯罗克韦尔变频器接入西门子PLC的配置案例
     在现代工业自动化领域,不同品牌设备之间的通信兼容性问题一直是企业面临的挑战之一。某智能工厂为了优化生产流程,提高设备的协同工作效率,决定对其生产线上的控制系统进行升级改造。该生产线中,AB罗克韦尔PowerFlex变频器作为关键的驱动设备,负责控制电机的转速和运行状态,采用的是......
  • 【 Kubernetes 集群】Pod 网络无法访问排查处理
    本文档介绍TKE集群中多场景下可能发生的常见网络问题,并给出对应的排查思路。当遇到此类问题时,建议您首先按照下文中的检查建议进行排查,若确认检查项无误后仍不能正常访问,请您联系我们寻求帮助。集群中不同节点上的容器(Pod)无法互访同一集群中不同节点上的Pod可以直接互......
  • EtherNetIP转Profinet网关模块罗克韦尔变频器接入西门子PLC的配置案例
    要实现从西门子PLC即PROFINET协议和川崎机器人即Ethernet/IP协议的通讯,通常需要一个通信适配器或网关,该设备能够理解PROFINET和Ethernet/IP协议,并在两者之间转换数据。下面介绍一个三方配置案例:本产品实现连接EtherNET/IP设备和网络到PROFINET网络系统。该网关可实现双向数据交......