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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:31:16