关于 flutter-text-rendering
这项技能面向 Flutter 开发者,帮助处理文本在内容长度、语言环境和无障碍设置变化时的布局。它涵盖溢出、换行、截断、富文本、尺寸测量和缩放的诊断与实现,并指导使用 Widget 测试验证。
主要功能
- 01诊断 Flex 与文本溢出
- 02控制换行和截断
- 03使用 Text.rich 组合行内样式
- 04通过 TextPainter 测量布局
- 05适配文本缩放和本地化
- 06使用 Widget 测试验证行为
适用场景
- 01修复受限 Row 中的文本溢出
- 02避免标题末尾单词孤行
- 03构建可展开或截断的文本
- 04测试放大字体下的本地化文案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ thienqo/ flutter-skills --skill flutter-text-rendering安装后在 Claude Code 中输入/flutter-text-rendering确认已加载。
附带文件references/text-overflow-and-wrapping.md
详细介绍
Flutter 文本渲染
在动态内容长度、不同地区设置和无障碍设置下,渲染清晰且可预测的文本。
诊断
调整布局前,先找出问题机制:
- 主轴 Flex 溢出: 非 Flex 的
Text在Flex主轴上可能受到无界约束,并选择大于其与同级元素之间可用空间的固有尺寸,从而导致RenderFlex overflowed。 - 孤行单词: 标题或段落的最后一个单词因换行发生在最后一个空格处,独自落在新的一行。
- 不可控的截断: 文本悄然裁切,或超出预期行数,且没有明显的截断提示(
ellipsis、fade)。 - 行内排版中断:
Row中多个相邻的Textwidget 无法像连续段落一样流畅换行,导致换行效果不自然。 - 文本缩放导致布局失效: 系统字体缩放比例增大(
TextScaler)后,文本在固定高度的容器中被裁切,或将关键操作挤出屏幕。
规则
- 约束相互竞争的分支,而不是所有
Text: 在Row中,当文本需要与同级元素共享有限的水平空间时,使用Flexible、Expanded、SizedBox或ConstrainedBox。在Column中,Flex 会改变垂直空间分配,因此并非解决水平文本溢出的默认方法。父级主轴约束无界时,切勿添加 Flex 子项。 - 仅在适合分词方式时避免孤行单词: 对于以空格分隔单词的标题、名称和提示文本,可以使用不换行空格(
\u00A0)将最后两个单词连在一起。不要在所有地区设置下都采用此启发式方法。 - 有意选择换行或截断: 完整文案至关重要时,允许自然换行。产品要求截断时,应将明确的
maxLines与TextOverflow.ellipsis、TextOverflow.fade或TextOverflow.clip搭配使用。未经确认单行裁切是否可接受,不要设置softWrap: false。 - 使用
Text.rich设置行内样式: 混合使用不同字重、颜色、行内徽标(WidgetSpan)或链接识别器时,优先使用Text.rich,以继承环境样式并支持文本缩放。原始RichText需要明确设置 span 样式和缩放,但可以继承环境文本方向。 - 文本布局取决于文案尺寸时,使用
TextPainter测量: 构建动态标签、自定义画布提示文本或可展开的“阅读更多”组件时,应使用明确的maxWidth以及环境中的方向、地区设置和TextScaler来布局TextPainter,从而检查渲染高度和didExceedMaxLines。 - 适配文本缩放: 支持放大的系统字体(
MediaQuery.textScalerOf(context))。避免为文本设置硬编码的容器高度;优先使用灵活或可滚动的容器。 - 考虑国际化: 设计文案容器时,应能容纳本地化字符串扩展 20–35% 的长度,并支持双向文本(
TextDirection)。
条件参考
- 修复 Flex 溢出、使用不换行空格消除孤行单词、配置
TextPainter测量或管理多行截断时,请阅读文本溢出与换行。
验证
使用以下内容测试文本组件:
- 最短文案(空内容或单个短词)。
- 符合预期的常见文案。
- 最长文案/本地化文案(包括带重音符号的字符串和较长的不含空格字符串)。
- 放大的字体缩放(
TextScaler.linear(1.5)和TextScaler.linear(2.0))。 - 受限的父级宽度(窄屏手机、紧凑卡片、列表项)。
编写 widget 测试,断言没有 RenderFlex 溢出,确认行数符合预期,并验证截断或不换行词组的显示效果符合预期。
Sources
评论
支持 Markdown