使用ScreenUtilInit后BottomSheet被键盘遮挡的问题求助
解决ScreenUtilInit导致BottomSheet被键盘遮挡的问题
问题背景
此前通过设置isScrollControlled: true,配合padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom)可解决BottomSheet被键盘遮挡的问题,但引入ScreenUtilInit包裹应用后,该方案失效,移除ScreenUtilInit则恢复正常。
原因分析
ScreenUtilInit会在应用层级插入自定义MediaQuery组件,将设计尺寸缩放后的值注入上下文环境。此时在BottomSheet的builder中调用MediaQuery.of(context),获取到的是被ScreenUtil修改后的MediaQueryData,其中viewInsets.bottom已被缩放处理,无法匹配键盘实际高度,导致padding计算错误。
解决方案
方案一:直接获取原始窗口的键盘高度
绕过ScreenUtil修改后的MediaQuery,从Flutter窗口实例中获取真实的键盘高度:
// 修改BottomSheet中的padding代码 padding: EdgeInsets.only( bottom: MediaQueryData.fromWindow(WidgetsBinding.instance.window).viewInsets.bottom, ),
方案二:配置ScreenUtil继承原始MediaQuery
在ScreenUtilInit中添加useInheritedMediaQuery: true参数,让其使用上层原始MediaQuery而非自行创建,保留系统级viewInsets属性:
void main() { runApp( ScreenUtilInit( designSize: Size(375, 812), useInheritedMediaQuery: true, // 启用该配置 builder: (context, child) => MyApp(), ), ); }
此配置下,ScreenUtil仅缩放尺寸相关参数,不干扰viewInsets,原有BottomSheet适配代码可正常工作。
更优响应式布局替代方案
原生方案(无第三方依赖)
- MediaQuery:通过
MediaQuery.of(context).size获取屏幕尺寸,自行计算布局比例。 - LayoutBuilder:根据父组件可用空间动态调整子组件,适配不同容器尺寸。
- FractionallySizedBox:按父组件尺寸百分比设置子组件大小,快速实现比例布局。
第三方包替代
若仍需第三方工具,可考虑responsive_framework,它提供灵活的断点配置,对系统MediaQuery的干扰更小,适配多设备场景更友好。
内容的提问来源于stack exchange,提问作者ILii
相关产品推荐
相关产品推荐

