Flutter:无需Context与MediaQuery获取设备像素比及响应式边距
Flutter 无Context下物理像素处理及响应式边距实现
方案一:无Context转换物理像素到逻辑像素
不用MediaQuery和Context的话,直接通过WidgetsBinding.instance.window.devicePixelRatio获取设备像素比——这是物理像素与逻辑像素的转换系数,用它就能把物理尺寸转成可直接用于EdgeInsets的逻辑尺寸:
// 获取屏幕物理尺寸 Size physicalSize = WidgetsBinding.instance.window.physicalSize; // 获取设备像素比 double pixelRatio = WidgetsBinding.instance.window.devicePixelRatio; // 转换为逻辑尺寸 Size logicalSize = Size( physicalSize.width / pixelRatio, physicalSize.height / pixelRatio, ); // 基于逻辑尺寸计算响应式边距(比如占屏幕宽度5%) double responsiveMargin = logicalSize.width * 0.05; EdgeInsets margin = EdgeInsets.all(responsiveMargin);
方案二:直接基于物理像素实现响应式边距
如果想直接以物理尺寸为基准做响应式计算,只需先按物理尺寸的比例算出目标物理像素值,再转成逻辑像素即可,本质是用物理尺寸的比例定义响应式规则:
Size physicalSize = WidgetsBinding.instance.window.physicalSize; double pixelRatio = WidgetsBinding.instance.window.devicePixelRatio; // 按物理宽度的5%计算边距(物理像素值) double physicalMargin = physicalSize.width * 0.05; // 转换为逻辑像素后给EdgeInsets使用 EdgeInsets margin = EdgeInsets.all(physicalMargin / pixelRatio);
注意:之前测试时混淆了设备像素比和屏幕宽高比,devicePixelRatio才是物理/逻辑像素转换的核心,每个设备的该值是固定的(如1.0、2.0、3.0),和屏幕宽高比无关。
内容的提问来源于stack exchange,提问作者NIMA Shahahmadian
相关产品推荐
相关产品推荐

