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

Flutter bottom sheet场景下如何将TextField固定在屏幕底部

报错原因

嵌套在Column内的Stack没有被明确约束尺寸,当你为TextField套入Positioned(bottom: 0)属性时,Stack需要确定自身高度才能计算子组件的位置,当前无固定尺寸的Stack无法满足Positioned的布局要求,就会触发hasSize相关报错。

解决方法

根据你的布局需求选择对应方案即可:

方案1:需要TextField悬浮在消息列表上层(滑动列表时内容会出现在TextField下方)

给Stack外层套Expanded,让Stack占满Column除了顶部Title之外的所有可用空间,获得明确的宽高约束后Positioned就能正常布局:

return Column(
  children: [
    const _Title(),
    // 新增Expanded约束Stack尺寸
    Expanded(
      child: Stack(
        children: [
          ListView(
            children: const [
              _Message(),
            ],
          ),
          // 给TextField套Positioned,同时指定left/right保证宽度撑满
          const Positioned(
            bottom: 0,
            left: 0,
            right: 0,
            child: TextField(
              decoration: InputDecoration(
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: Colors.grey,
                  ),
                ),
                border: OutlineInputBorder(),
                hintText: 'Enter a search term',
              ),
            ),
          ),
        ],
      ),
    ),
  ],
);

方案2:不需要悬浮效果,TextField固定在底部,消息列表滚动不会被遮挡

不需要用Stack,直接调整Column的结构,让ListView占满中间剩余空间即可,布局更简洁:

return Column(
  children: [
    const _Title(),
    // 让ListView占满Title和TextField之间的所有空间
    Expanded(
      child: ListView(
        children: const [
          _Message(),
        ],
      ),
    ),
    // TextField直接放在Column最底部
    const TextField(
      decoration: InputDecoration(
        enabledBorder: OutlineInputBorder(
          borderSide: BorderSide(
            color: Colors.grey,
          ),
        ),
        border: OutlineInputBorder(),
        hintText: 'Enter a search term',
      ),
    ),
  ],
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:24:01