HarmonyOS鸿蒙Next中RN的Dimensions.get('window'))宽高为0问题
HarmonyOS鸿蒙Next中RN的Dimensions.get(‘window’))宽高为0问题 RN版本0.72.5 react-native-harmony版本0.72.67 在RN中取Dimensions.get(‘window’))
console.log('window====', Dimensions.get('window'))
打印结果为:
取到的宽高均为0,请各位帮分析一下报错原因并给出解决方案;
更多关于HarmonyOS鸿蒙Next中RN的Dimensions.get('window'))宽高为0问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我现在先用 Dimensions.get(‘screen’)代替,可以获取手机屏幕宽高。
更多关于HarmonyOS鸿蒙Next中RN的Dimensions.get('window'))宽高为0问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
Dimensions.get(‘screen’)代替只是臨時的解決方案,一些三方庫或組件也使用了Dimensions.get(‘window’))獲取屏幕寬高,若使用Dimensions.get(‘screen’)可能還會導致引發一些不可控的問題。 我的問題是由於重寫onWindowStageCreate方法導致的,在該方法下添加super.onWindowStageCreate(windowStage);即可;
我也遇到了,https://developer.huawei.com/consumer/cn/forum/topic/0204193070307980058?fid=0109140870620153026 技术支持说要升级到 0.72.75 我还没试;
感谢回复,感觉不是版本的问题,升级之后还是取不到值。
若是你解决了,麻烦回复我下,我这边还是没解决😂,
解决了,本质原因是重写了鸿蒙侧onWindowStageCreate方法导致的: 在该方法下添加super.onWindowStageCreate(windowStage);就好了。 同时我把react-native-harmony回退到0.72.59版本了,不清楚和这个有没有关系。
在HarmonyOS Next中,RN的Dimensions.get('window')返回宽高为0,通常是由于组件初始化时窗口尺寸尚未就绪。可尝试在onLayout回调中获取,或使用useWindowDimensions Hook实时监听。确保在组件挂载后异步获取尺寸,或检查容器布局是否正确渲染。
在HarmonyOS Next中,Dimensions.get('window')返回宽高为0,通常是因为在应用启动或组件挂载的早期阶段,窗口的尺寸信息尚未准备就绪。这并非报错,而是获取时机问题。
核心原因分析:
- 生命周期时机:在
App或根组件componentDidMount/useEffect中立即调用Dimensions.get('window')时,HarmonyOS的UI布局可能尚未完成,导致获取到初始值0。 - 事件驱动未触发:
Dimensions模块依赖原生层在窗口尺寸就绪后触发事件更新,若在事件触发前获取,值可能为0。
解决方案:
- 使用
Dimensions.addEventListener监听尺寸变化(推荐): 在组件挂载时添加监听器,确保获取到的是布局完成后的实际尺寸。import { Dimensions } from 'react-native-harmony'; useEffect(() => { const subscription = Dimensions.addEventListener('change', ({ window }) => { console.log('实际窗口尺寸:', window); // 在此处使用宽高进行布局或状态更新 }); // 初始获取(可能仍为0,但监听器会捕获后续有效值) console.log('初始尺寸:', Dimensions.get('window')); return () => subscription.remove(); }, []); - 延迟获取:
在
useEffect中设置短暂延迟(如setTimeout),等待UI线程布局完成。useEffect(() => { setTimeout(() => { console.log('延迟后尺寸:', Dimensions.get('window')); }, 100); }, []); - 在
onLayout事件中获取: 在根视图的onLayout回调中获取,此时布局已计算完成。const handleLayout = (event) => { const { width, height } = event.nativeEvent.layout; console.log('布局完成后的尺寸:', { width, height }); }; return <View onLayout={handleLayout} style={{ flex: 1 }}>...</View>;
注意事项:
- 避免同步依赖初始尺寸:不要假设
Dimensions.get('window')在应用启动时立即返回有效值,应通过监听或事件驱动方式处理。 - HarmonyOS Next适配差异:与Android/iOS相比,HarmonyOS的UI初始化时序可能存在差异,需通过监听机制确保兼容性。
react-native-harmony版本:确保使用最新兼容版本(你当前的0.72.67是较新版本),但此问题主要与系统UI准备时序相关,而非库版本问题。
总结:优先采用Dimensions.addEventListener方案,这是React Native标准API,能可靠响应尺寸变化(如屏幕旋转),且符合HarmonyOS Next的UI事件驱动模型。

