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

Flutter如何实现Row组件内每行最多放置5个输入Widget

Flutter 每行固定5个TextField实现方案

方案一:使用GridView.count(推荐)

直接通过指定交叉轴数量控制每行元素个数,代码更简洁,自带滚动、间距配置能力:

final inputs = List.generate(100, (i) => TextEditingController());

// 渲染逻辑
GridView.count(
  // 若将GridView放在其他可滚动组件内,需添加以下两个属性避免布局冲突
  shrinkWrap: true,
  physics: const NeverScrollableScrollPhysics(),
  crossAxisCount: 5, // 核心配置:每行最多展示5个输入框
  crossAxisSpacing: 3, // 水平方向输入框之间的间距
  mainAxisSpacing: 8, // 垂直方向行与行之间的间距,可自行调整
  padding: const EdgeInsets.all(8),
  children: List.generate(inputs.length, (index) {
    return TextField(
      autocorrect: false,
      controller: inputs[index],
      decoration: const InputDecoration(
        isDense: true, // 压缩输入框默认上下内边距,布局更紧凑
        border: OutlineInputBorder(),
      ),
    );
  }),
)

实现效果参考:
效果参考图

方案二:手动分组+Column嵌套Row实现

如果需要自定义每行的特殊逻辑,可以先把100个控制器按每5个一组拆分,再逐行渲染:

// 1. 先将控制器列表按每5个为一组拆分
List<List<TextEditingController>> controllerGroups = [];
for (int i = 0; i < inputs.length; i += 5) {
  int endIndex = i + 5 > inputs.length ? inputs.length : i + 5;
  controllerGroups.add(inputs.sublist(i, endIndex));
}

// 2. 渲染逻辑
Column(
  children: controllerGroups.map((group) {
    return Padding(
      padding: const EdgeInsets.only(bottom: 8), // 行与行之间的垂直间距
      child: Row(
        children: group.map((controller) {
          return Expanded(
            child: Padding(
              padding: const EdgeInsets.only(right: 3),
              child: TextField(
                autocorrect: false,
                controller: controller,
                decoration: const InputDecoration(
                  isDense: true,
                  border: OutlineInputBorder(),
                ),
              ),
            ),
          );
        }).toList(),
      ),
    );
  }).toList(),
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:48:02