关于 flutter-use-column-row-first
面向 Flutter 开发者的响应式布局技能,从 Column 和 Row 组合入手,再运用约束与自适应模式,避免僵硬的屏幕尺寸布局。
主要功能
- 01优先使用 Column 和 Row
- 02用弹性组件分配空间
- 03处理换行与滚动内容
- 04根据可用空间调整布局
- 05检查约束与溢出
适用场景
- 01构建响应式 Flutter 页面
- 02避免文本和行布局溢出
- 03选择换行或滚动方式
- 04适配窄屏与宽屏布局
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill flutter-use-column-row-first安装后在 Claude Code 中输入/flutter-use-column-row-first确认已加载。
附带文件agents/openai.yaml
详细介绍
Flutter 优先使用 Column 和 Row
从约束系统出发构建响应式 Flutter 布局。优先采用简单的弹性组合,仅在设计确有具体需求时才引入固定尺寸或叠加布局。
布局工作流
- 判断每个组的主要布局方式是垂直、水平、重叠、滚动还是换行。
- 垂直组从
Column开始,水平组从Row开始。 - 嵌套小型、命名清晰的组件,而不是构建一个深度嵌套的
build方法。 - 使用
Expanded、Flexible和Spacer分配有界的可用空间。 - 有意地添加内边距、对齐方式、宽高比和约束。
- 测试狭窄和宽阔的约束、文本缩放、键盘显示,以及较长或本地化的内容。
规则
- 垂直流优先使用
Column,水平流优先使用Row。 - 使用
mainAxisAlignment、crossAxisAlignment和mainAxisSize控制对齐方式。 - 当子项必须填满其分配的主轴剩余空间时,使用
Expanded。 - 当子项可以少用其分配的空间时,使用
Flexible。 - 仅使用
flex表示按比例分配。flex: 2的子项获得的可用空间份额是flex: 1兄弟项的两倍。 - 使用
Spacer在兄弟项之间灵活留白。使用SizedBox设置有意指定的固定间距。 - 在
Row中,如果文本或其他宽度可变的内容必须为兄弟项让出空间,请将其包装在Expanded或Flexible中。 - 当垂直内容可能超出视口时,使用
ListView或其他可滚动组件;Column不会滚动。 - 当水平子项应换到下一行,而不是缩小或溢出时,使用
Wrap。 - 当布局组合本身必须随可用空间变化时,使用
LayoutBuilder、断点或自适应组件。 - 当内容必须避开系统遮挡区域时,使用
SafeArea。
避免僵硬布局
不要将以下方式作为默认布局机制:
- 使用硬编码
Positioned坐标的Stack - 使用硬编码屏幕尺寸般宽度或高度的
Container、SizedBox或ConstrainedBox - 用于模拟正常文档流的偏移、变换或外边距
- 从设计稿复制的屏幕尺寸
在这些方式有具体用途时使用,例如:
- 真实的视觉重叠、徽标、浮动控件或锚定装饰
- 触控目标最小尺寸、图标尺寸、缩略图或有界媒体
- 刻意设置的最大阅读宽度
- 宽高比要求
- 平台或设计系统常量
如果用途不明显,请在代码结构中体现,或添加简短注释说明。
约束安全性
- 仅在
Row、Column或Flex下使用Expanded和Flexible。 - 沿无界主轴不要使用非零 flex。在垂直滚动组件中,应移除垂直方向的
Expanded或Flexible,或建立有意义的有限约束。 - 如果嵌套的
Column需要外层Column的剩余高度,请将内层Column包装在Expanded中。 - 诊断溢出时,先检查约束和可变内容,再添加裁剪或更小的硬编码尺寸。
- 对确实超出可用空间的内容,优先使用滚动布局。
推荐模式
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Header(),
const SizedBox(height: 16),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Flexible(flex: 2, child: PrimaryContent()),
const SizedBox(width: 16),
const Flexible(child: SecondaryContent()),
],
),
),
const SizedBox(height: 16),
const Actions(),
],
),
)
如果水平内容在窄屏上无法保持可用,请在断点处更改此布局组合;不要只是一味挤压内容。
视觉参考
将设计稿拆解为嵌套弹性布局时,请查看以下示意图:
- Pavlova 行列布局展示了整体的水平
Row,其中包含垂直内容Column和一张图片。 - 嵌套行列示意图展示了如何将较小的评分组和图标组拆分为嵌套的
Row和Column组件。
将这些示意图作为结构参考,而不是固定像素模板。
验证
- 确认在受支持的视口尺寸下不会出现 RenderFlex 溢出。
- 确认文本会按预期换行或截断。
- 确认弹性子项受到有界约束。
- 确认可滚动内容始终可访问。
- 确认固定尺寸以及
Stack或Positioned的用法有明确的设计理由。
来源
评论
支持 Markdown