driftPang
driftPang
  • 发布:53 分钟前
  • 更新:52 分钟前
  • 阅读:15

uni.getSystemInfoSync() 获取的windowWidth为什么是0

分类:uni-app x

如题 //‍[⁠uts.sdk.modules.DCloudUniGetSystemInfo.GetSystemInfoResult⁠]‍
{
"SDKVersion": "",
"appId": "UNIE5D6309",
"appLanguage": "zh-Hans",
"appName": "营养大观园-uni-app-x-vdom",
"appTheme": "light",
"appVersion": "1.0.1",
"appVersionCode": "100",
"appWgtVersion": null,
"brand": "huawei",
"browserName": "",
"browserVersion": "",
"deviceBrand": "huawei",
"deviceId": "1256e5cf-35f9-454c-9182-c41d6acddcdc",
"deviceModel": "HMA-AL00",
"deviceOrientation": "portrait",
"devicePixelRatio":
//‍[number]‍
2.55,
"deviceType": "phone",
"hostFontSizeSetting": null,
"hostLanguage": null,
"hostName": null,
"hostSDKVersion": null,
"hostTheme": null,
"hostVersion": null,
"language": "zh-CN",
"model": "HMA-AL00",
"osAndroidAPILevel":
//‍[number]‍
29,
"osHarmonyDisplayVersion": null,
"osHarmonySDKAPIVersion": null,
"osLanguage": "zh-CN",
"osName": "android",
"osTheme": "light",
"osVersion": "10",
"pixelRatio":
//‍[number]‍
2.55,
"platform": "android",
"romName": "HarmonyOS",
"romVersion": "4.0.0",
"safeArea":
//‍[⁠uts.sdk.modules.DCloudUniGetSystemInfo.SafeArea⁠]‍
{
"bottom":
//‍[number]‍
0,
"height":
//‍[number]‍
-40,
"left":
//‍[number]‍
0,
"right":
//‍[number]‍
0,
"top":
//‍[number]‍
40,
"width":
//‍[number]‍
0
},
"safeAreaInsets":
//‍[⁠uts.sdk.modules.DCloudUniGetSystemInfo.SafeAreaInsets⁠]‍
{
"bottom":
//‍[number]‍
0,
"left":
//‍[number]‍
0,
"right":
//‍[number]‍
0,
"top":
//‍[number]‍
40
},
"screenHeight":
//‍[number]‍
880,
"screenWidth":
//‍[number]‍
424,
"statusBarHeight":
//‍[number]‍
40,
"system": "Android 10",
"ua": "uni-app-x/5.24",
"uniCompileVersion": "5.24",
"uniCompileVersionCode":
//‍[number]‍
5.24,
"uniCompilerVersion": "5.24",
"uniCompilerVersionCode":
//‍[number]‍
5.24,
"uniPlatform": "app",
"uniRuntimeVersion": "5.24",
"uniRuntimeVersionCode":
//‍[number]‍
5.24,
"version": "15006",
"windowBottom":
//‍[number]‍
0,
"windowHeight":
//‍[number]‍
836,
"windowTop":
//‍[number]‍
0,
"windowWidth":
//‍[number]‍
0
}
uni-app-x vdom 模式下获取的windowWidth 为什么是0

53 分钟前 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。

这是一个已知的平台差异问题,尤其在 Android 模拟器或部分 ROM(如华为/HarmonyOS 兼容层)的特定系统版本上容易出现。

核心原因:
windowWidth 为 0 而 screenWidth 正常,通常是因为 App 原生窗口(Activity/Window)尚未完成首次布局测量(Layout),导致获取到的窗口可用宽度为 0。这在 VDOM 模式下,如果页面初始化时过早同步调用(如在 onLoad 或全局 App.uvueonLaunch 中),更容易出现。

建议解决方案:

  1. 使用 uni.getWindowInfo() 替代(推荐)
    uni-app x 提供了更专注的 uni.getWindowInfo() API,其实现机制对窗口尺寸的获取时机做了优化,能避免 getSystemInfoSync 在部分场景下的时序问题。

    // 在页面或组件中  
    const info = uni.getWindowInfo()  
    console.log('windowWidth:', info.windowWidth) // 通常能正确获取  

    本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

  2. 延迟到 onReady 生命周期获取
    如果必须在 getSystemInfoSync 中获取,请确保在页面渲染完成后调用,而不是在 onLoadsetup 的同步代码中:

    import { onReady } from '@dcloudio/uni-app'  
    
    onReady(() => {  
     const info = uni.getSystemInfoSync()  
     // 此时 windowWidth 应该已正常  
     console.log(info.windowWidth)  
    })  

    本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

  3. 真机验证
    根据社区反馈,该问题在 Android 模拟器 上较为常见,真机(如小米、华为等)通常返回值正常。建议优先使用真机调试验证。

参考:

总结: 优先改用 uni.getWindowInfo(),或在 onReady 生命周期后再获取。如果仍有问题,请确认真机环境,并检查 HBuilderX 是否为最新版本(5.24+ 已修复多项窗口信息获取的时序问题)。

内容为 AI 生成,仅供参考

要回复问题请先登录注册