在这里插入图片描述

案例概述

Wrap 是一个自动换行的布局组件。当子组件超过容器宽度时,会自动换到下一行。本案例展示了如何使用 Wrap。

核心概念

1. Wrap 基础

Wrap 是自动换行的布局组件。

2. 间距控制

可以控制子组件之间的间距。

3. 对齐方式

支持多种对齐方式。

代码详解

示例 1:基础 Wrap

class BasicWrapExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Wrap(
      children: List.generate(10, (index) {
        return Container(
          width: 80,
          height: 80,
          color: Colors.primaries[index % Colors.primaries.length],
          margin: const EdgeInsets.all(4),
        );
      }),
    );
  }
}

代码解释: Wrap 自动换行显示子组件。当一行空间不足时,自动移到下一行。spacing 控制水平间距,runSpacing 控制行间距。这比 Row 灵活,Row 会溢出,而 Wrap 自动换行。常用于标签、按钮组、网格等自适应布局。

示例 2:标签

class TagsExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final tags = ['Flutter', 'Dart', 'UI', '设计', '开发', '移动应用'];
    return Wrap(
      spacing: 8,
      runSpacing: 8,
      children: tags.map((tag) {
        return Chip(label: Text(tag));
      }).toList(),
    );
  }
}

代码解释: 这个示例使用 Wrap + Chip 实现标签云。spacing 和 runSpacing 分别控制标签间的水平和垂直间距。Chip 是 Material Design 中的标签组件,自动处理样式。这种组合在搜索结果、热门标签、兴趣选择等场景中很常见。

示例 3:按钮组

class ButtonGroupExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Wrap(
      spacing: 8,
      children: [
        ElevatedButton(onPressed: () {}, child: const Text('按钮1')),
        ElevatedButton(onPressed: () {}, child: const Text('按钮2')),
        ElevatedButton(onPressed: () {}, child: const Text('按钮3')),
        ElevatedButton(onPressed: () {}, child: const Text('按钮4')),
      ],
    );
  }
}

代码解释: Wrap 用于排列按钮组。当屏幕宽度不足时,按钮自动换行。这比 Row 更灵活,避免按钮溢出。常用于操作栏、过滤选项等。

示例 4:对齐方式

class AlignmentExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Wrap(
      alignment: WrapAlignment.center,
      spacing: 8,
      children: List.generate(5, (index) {
        return Container(
          width: 60,
          height: 60,
          color: Colors.blue,
        );
      }),
    );
  }
}

代码解释: alignment 参数控制 Wrap 内容的对齐方式。WrapAlignment.center 使内容居中。其他选项包括 start、end、spaceEvenly 等。crossAxisAlignment 则控制垂直对齐。

示例 5:可选择标签

class SelectableTagsExample extends StatefulWidget {
  
  State<SelectableTagsExample> createState() => _SelectableTagsExampleState();
}

class _SelectableTagsExampleState extends State<SelectableTagsExample> {
  final Set<int> _selectedTags = {};

  
  Widget build(BuildContext context) {
    final tags = ['标签1', '标签2', '标签3', '标签4', '标签5'];
    return Wrap(
      spacing: 8,
      children: List.generate(tags.length, (index) {
        return FilterChip(
          label: Text(tags[index]),
          selected: _selectedTags.contains(index),
          onSelected: (selected) {
            setState(() {
              if (selected) {
                _selectedTags.add(index);
              } else {
                _selectedTags.remove(index);
              }
            });
          },
        );
      }),
    );
  }
}

代码解释: 这个示例展示了可选择标签。使用 FilterChip 实现可选择功能。

高级话题

1. 动态/响应式设计

根据屏幕大小调整 Wrap。

2. 动画与过渡

自定义 Wrap 动画。

3. 搜索/过滤/排序

过滤标签。

4. 选择与批量操作

支持多选。

5. 加载与缓存

显示加载状态。

6. 键盘导航

支持键盘快捷键。

7. 无障碍支持

提供无障碍支持。

8. 样式自定义

自定义样式。

9. 数据持久化/导出

保存状态。

10. 单元测试与集成测试

测试功能。

PC 端适配要点

  • 根据屏幕大小调整 Wrap
  • 支持键盘快捷键
  • 提供清晰的布局

实际应用场景

  • 标签显示:显示标签
  • 按钮组:显示按钮组
  • 搜索结果:显示搜索结果
  • 分类选择:选择分类

扩展建议

  • 学习高级布局库
  • 研究性能优化
  • 探索自定义效果
  • 集成布局库

总结

Wrap 是自动换行的有效方式。通过灵活使用 Wrap,可以创建各种布局效果。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐