Flutter获取屏幕尺寸占比有没有无需编写完整MediaQuery的快捷方式?
两种可行的实现方案
方案1:扩展BuildContext 推荐,适配绝大多数场景
你可以直接对BuildContext做扩展方法,不需要额外维护全局状态,调用非常简便:
- 定义扩展方法
extension ScreenSizeExtension on BuildContext { /// 按百分比获取屏幕宽度 double wp(double percentage) => MediaQuery.of(this).size.width * percentage; /// 按百分比获取屏幕高度 double hp(double percentage) => MediaQuery.of(this).size.height * percentage; }
- 调用方式
只要是能拿到context的位置,直接写context.wp(0.65)即可替换原有的完整代码,和原生调用逻辑完全一致,自动适配横竖屏切换、字体缩放等系统配置变化。
方案2:全局单例存储 适配无context的特殊场景
如果你的调用场景确实无法拿到BuildContext,可以在应用启动时提前把屏幕尺寸存入全局单例,后续直接调用:
- 定义全局工具类
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; }
- 初始化
在应用根组件(一般是MaterialApp的home页面)的initState生命周期中调用:
@override void initState() { super.initState(); ScreenTool().init(context); }
- 调用方式
任何位置都可以直接写ScreenTool().wp(0.65),无需传context。
注意:如果应用支持横竖屏切换,需要在屏幕尺寸变化时重新调用
init方法更新存储的尺寸值,否则会读取到旧数据。
内容的提问来源于stack exchange,提问作者morganXap
相关产品推荐
相关产品推荐

