Appearance
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 macos1
2
3
2
3
启动后在首页进入 Flutter 文本测量与展开更多。
4. 观察步骤
- 收起态精确测量:看列表卡片与顶部样例,确认
… 展开更多贴在第三行末尾,而不是单独掉到第四行。 - 展开态尾部收起:点击任意
… 展开更多,全文展开后末尾出现蓝色可点收起;点击后回到收起态。 - 单项互斥模式:切换 SegmentedButton 到「单项互斥展开」,依次点开不同卡片,确认同一时间只有一个 item 保持展开。
- 多项可同时展开:切回「多项可同时展开」,依次点开多张卡片,确认可同时展开多项。
- 全部展开 / 全部收起:点顶部「全部展开」,列表项应全部进入展开态并显示
收起;点「全部收起」后全部回到收起态。 - 父层 hoist 对照:展开任意列表项时,看卡片下方提示文案是否随态切换;滚动或切换模式时不应出现「串项」。
- 简单 ellipsis 对照:滚到页面底部对照区,确认只有系统省略号、没有可点尾部,体会能力边界。
5. 预期现象
- 精确方案中,「展开更多」会贴在第三行尾部;展开后尾部「收起」可点击
- 简单方案只展示 ellipsis,对照它的能力边界
- 列表项展开态由父层控制,切换不会串项
- 单项模式下互斥展开;多项模式与批量按钮可演示父层统一策略
6. 对应知识库文档
- 理论主文档:Jetpack Compose 文本测量、自定义截断与“展开更多”
- 状态分层总览:状态管理、路由、架构