You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取横竖屏一致的正确设备宽高比?

解决Flutter横竖屏切换时获取一致设备宽高比的问题

问题根源

你之前的代码依赖isPortrait判断当前方向来交换宽高,但isPortrait是基于当前窗口的显示方向,而部分设备的原生物理方向可能不是竖屏(比如部分平板默认横屏),这会导致方向判断和物理尺寸的宽高对应关系出错,最终计算出的宽高比不一致。

正确解决方案

直接取物理尺寸的宽和高中的最大值除以最小值,这样无论屏幕如何旋转,得到的都是设备原生的宽高比(比如16:9、4:3等,统一为大值/小值的形式),保证横竖屏结果一致。

方案一:基于View的physicalSize

final physicalSize = View.of(context).physicalSize;
// 取较大值除以较小值,得到一致的宽高比
final deviceAspectRatio = physicalSize.width > physicalSize.height 
    ? physicalSize.width / physicalSize.height 
    : physicalSize.height / physicalSize.width;

方案二:基于MediaQuery计算物理分辨率

如果你需要先获取设备的物理分辨率(宽x高),再计算宽高比,可以用MediaQuery结合设备像素比:

final mediaQuery = MediaQuery.of(context);
// 逻辑尺寸转物理尺寸
final physicalWidth = mediaQuery.size.width * mediaQuery.devicePixelRatio;
final physicalHeight = mediaQuery.size.height * mediaQuery.devicePixelRatio;
// 同样取大值/小值保证一致
final deviceAspectRatio = physicalWidth > physicalHeight 
    ? physicalWidth / physicalHeight 
    : physicalHeight / physicalWidth;

额外说明

如果需要获取设备原生的物理分辨率(固定宽高,不受旋转影响),可以通过WidgetsBinding获取窗口的原生物理尺寸:

final window = WidgetsBinding.instance.window;
final nativePhysicalSize = window.physicalSize;
// 这里的nativePhysicalSize是设备原生的物理尺寸,比如手机竖屏时的1080x1920,平板横屏时的2048x1536
final nativeAspectRatio = nativePhysicalSize.width / nativePhysicalSize.height;

注意:部分设备的window.physicalSize可能仍会随系统旋转变化,此时还是用取最大值/最小值的方法更稳妥。

内容的提问来源于stack exchange,提问作者Shahbaz Hashmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:00:05