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

Flutter软键盘弹出时仅移动TextField 避免任务列表被顶出屏幕

问题根源
  • 外层嵌套SingleChildScrollView是核心问题:软键盘弹出时,该组件会自动滚动整体布局以保证输入框处于可视区域,直接把上方任务列表顶出屏幕。
  • 手动通过MediaQuery计算高度的方案存在固有误差:需要扣减的尺寸不止AppBar高度、状态栏高度、键盘高度,还包括Scaffold自身的布局边距、渲染时的像素对齐差值,很容易出现小幅滚动、遮挡首条任务的问题。
  • 多余的嵌套滚动逻辑冲突:TaskList内部已经使用ListView.builder实现了列表滚动,外层再加可滚动组件会造成滚动优先级混乱。
最优实现方案

完全移除手动高度计算和外层SingleChildScrollView,用Flutter原生弹性布局自动适配空间变化,零像素误差:

return Scaffold(
  appBar: appBar,
  body: Column(
    children: [
      // Expanded会自动占满除底部输入框外的所有剩余空间
      // 软键盘弹出时会自动收缩高度,无需手动计算键盘占用尺寸
      Expanded(
        child: TaskList(_userTasks),
      ),
      // 底部输入框固定高度,始终停靠在内容区底部
      SizedBox(
        height: 60, // 按设计稿给固定高度即可,无需按比例计算
        child: NewTask(_addNewTask),
      ),
    ],
  ),
);

适配补充

如果需要适配全面屏的底部安全区,只需要给底部输入框组件套上SafeArea即可,不需要改动其他布局:

SafeArea(
  top: false, // 顶部不需要重复适配,AppBar已经处理了状态栏安全区
  child: SizedBox(
    height: 60,
    child: NewTask(_addNewTask),
  ),
)

原问题异常效果演示:
软键盘弹出顶出任务列表的异常效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:57:18