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

Flutter获取屏幕尺寸占比有没有无需编写完整MediaQuery的快捷方式?

两种可行的实现方案

方案1:扩展BuildContext 推荐,适配绝大多数场景

你可以直接对BuildContext做扩展方法,不需要额外维护全局状态,调用非常简便:

  1. 定义扩展方法
extension ScreenSizeExtension on BuildContext {
  /// 按百分比获取屏幕宽度
  double wp(double percentage) => MediaQuery.of(this).size.width * percentage;
  /// 按百分比获取屏幕高度
  double hp(double percentage) => MediaQuery.of(this).size.height * percentage;
}
  1. 调用方式
    只要是能拿到context的位置,直接写context.wp(0.65)即可替换原有的完整代码,和原生调用逻辑完全一致,自动适配横竖屏切换、字体缩放等系统配置变化。

方案2:全局单例存储 适配无context的特殊场景

如果你的调用场景确实无法拿到BuildContext,可以在应用启动时提前把屏幕尺寸存入全局单例,后续直接调用:

  1. 定义全局工具类
class ScreenTool {
  static final ScreenTool _singleton = ScreenTool._internal();
  factory ScreenTool() => _singleton;
  ScreenTool._internal();

  late double screenWidth;
  late double screenHeight;

  // 应用初始化时调用一次即可
  void init(BuildContext context) {
    final mediaQueryData = MediaQuery.of(context);
    screenWidth = mediaQueryData.size.width;
    screenHeight = mediaQueryData.size.height;
  }

  double wp(double percentage) => screenWidth * percentage;
  double hp(double percentage) => screenHeight * percentage;
}
  1. 初始化
    在应用根组件(一般是MaterialApp的home页面)的initState生命周期中调用:
@override
void initState() {
  super.initState();
  ScreenTool().init(context);
}
  1. 调用方式
    任何位置都可以直接写ScreenTool().wp(0.65),无需传context。

注意:如果应用支持横竖屏切换,需要在屏幕尺寸变化时重新调用init方法更新存储的尺寸值,否则会读取到旧数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:06:03