Skip to content

flutter-expandable-text-demo ​

1. 实验目标 ​

验证 Flutter 里两条“展开更多”实现路径:

  • 精确方案:TextPainter 测量 + 尾部拼接
  • 简单方案:maxLines + TextOverflow.ellipsis

并同时演示列表项展开态为什么默认要提升到父层管理,以及父层如何统一控制「多项可同时展开 / 单项互斥展开」与「全部展开 / 全部收起」。

2. 工程要点 ​

  • TextPainter 负责真实宽度下的离线测量,未超出 maxLines 时自动退化为纯文本展示(无需展开/收起)
  • LayoutBuilder 负责感知可用宽度变化
  • 父层 Set<int> 负责 item 级展开态,演示「单项互斥」与「多项同时展开」
  • 收起态 suffix … 展开更多 精准贴在第 3 行末尾;展开态尾部 \u00A0收起 具备防拆字换行保护,均通过 RichText + TapGestureRecognizer 做成可点击区
  • 覆盖短文本(不足 3 行)、临界文本(3 行边界)、超长文本(6~8 行)与中英混排样本
  • 简单方案保留做边界对照,不把它伪装成完整解

3. 运行方式 ​

bash
cd labs/flutter/host
flutter pub get
flutter run -d macos

启动后在首页进入 Flutter 文本测量与展开更多。

4. 观察步骤 ​

  1. 收起态精确测量:看列表卡片与顶部样例,确认 … 展开更多 贴在第三行末尾,而不是单独掉到第四行。
  2. 展开态尾部收起:点击任意 … 展开更多,全文展开后末尾出现蓝色可点 收起;点击后回到收起态。
  3. 单项互斥模式:切换 SegmentedButton 到「单项互斥展开」,依次点开不同卡片,确认同一时间只有一个 item 保持展开。
  4. 多项可同时展开:切回「多项可同时展开」,依次点开多张卡片,确认可同时展开多项。
  5. 全部展开 / 全部收起:点顶部「全部展开」,列表项应全部进入展开态并显示 收起;点「全部收起」后全部回到收起态。
  6. 父层 hoist 对照:展开任意列表项时,看卡片下方提示文案是否随态切换;滚动或切换模式时不应出现「串项」。
  7. 简单 ellipsis 对照:滚到页面底部对照区,确认只有系统省略号、没有可点尾部,体会能力边界。

5. 预期现象 ​

  • 精确方案中,「展开更多」会贴在第三行尾部;展开后尾部「收起」可点击
  • 简单方案只展示 ellipsis,对照它的能力边界
  • 列表项展开态由父层控制,切换不会串项
  • 单项模式下互斥展开;多项模式与批量按钮可演示父层统一策略

6. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17