Flutter × OpenHarmony 实战:用 ListTile 构建高复用的设置型列表界面
Flutter × OpenHarmony 实战:用 ListTile 构建高复用的设置型列表界面
前言
在实际应用开发中,“列表页”几乎是出现频率最高的 UI 形态之一:设置页、个人中心、功能入口页、信息总览页,本质上都是一组结构一致、内容不同的条目集合。
在 Flutter × OpenHarmony 的跨端开发场景下,如何用最少的代码构建一个规范、易维护、符合系统风格的列表布局,是每个开发者都会遇到的问题。
本文通过一个经典示例 —— 使用 ListTile 构建“带图标 + 标题 + 副标题 + 右箭头”的列表组件,系统讲解:
- Flutter 在 OpenHarmony 上的 UI 构建方式
- ListTile 的完整用法
- 如何写出工程级可复用的列表组件

背景
在传统原生开发中:
- Android:
RecyclerView + ViewHolder - iOS:
UITableView / UICollectionView - 鸿蒙 ArkUI:
List + ListItem
都需要写大量模板代码来描述一个列表结构。
而 Flutter 的核心优势在于:
UI 即 Widget,布局即组合。
列表不是“控件”,而是由 Widget 动态组合出来的结构树。
在跨端场景(Flutter × OpenHarmony)中,这种声明式 UI 模式尤其重要:
- 一套 Dart 代码
- 同时运行在 Android / iOS / OpenHarmony
- UI 表现高度一致
- 无需维护多端 UI 逻辑
Flutter × OpenHarmony 跨端开发介绍
Flutter 在 OpenHarmony 上的运行模式,本质是:
Flutter Framework (Dart)
↓
Flutter Engine (Skia 渲染)
↓
OpenHarmony 图形子系统
也就是说:
- Flutter 负责 UI 描述
- Skia 负责跨平台绘制
- OpenHarmony 提供窗口系统与输入事件
对开发者来说,几乎 100% 复用 Flutter 原生写法,无需感知底层差异。
因此像 ListView、ListTile 这种组件:
- 在 Android 可用
- 在 iOS 可用
- 在 OpenHarmony 同样可用
这就是 Flutter × OpenHarmony 最大的工程价值:
一次开发,多端一致体验。

开发核心代码(详细解析)

一、完整实现代码
/// 构建带图标和副标题的列表布局
/// 展示ListTile的完整用法,包含leading图标、title标题、subtitle副标题和trailing箭头
Widget _buildListWithIcons(ThemeData theme) {
final items = [
{'icon': Icons.home, 'title': '首页', 'subtitle': '返回主页面'},
{'icon': Icons.settings, 'title': '设置', 'subtitle': '应用设置选项'},
{'icon': Icons.person, 'title': '个人中心', 'subtitle': '查看个人信息'},
{'icon': Icons.notifications, 'title': '通知', 'subtitle': '消息通知管理'},
{'icon': Icons.help, 'title': '帮助', 'subtitle': '使用帮助文档'},
];
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: theme.colorScheme.surfaceContainerHighest,
),
child: ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: items.length,
separatorBuilder: (context, index) => Divider(
height: 1,
color: theme.colorScheme.onSurface.withValues(alpha: 0.1),
),
itemBuilder: (context, index) {
final item = items[index];
return ListTile(
leading: Icon(item['icon'] as IconData),
title: Text(item['title'] as String),
subtitle: Text(item['subtitle'] as String),
trailing: const Icon(Icons.chevron_right),
onTap: () {},
);
},
),
);
}
二、数据层设计:items 列表
final items = [
{'icon': Icons.home, 'title': '首页', 'subtitle': '返回主页面'},
...
];
这里本质是一个 轻量级 ViewModel:
- icon:图标
- title:主标题
- subtitle:副标题
在真实项目中,通常会升级为:
class MenuItem {
final IconData icon;
final String title;
final String subtitle;
}
但在 Demo 场景下,用 Map 更直观。
核心思想:UI 不直接写死内容,而是由数据驱动。

三、Container:外层样式容器
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: theme.colorScheme.surfaceContainerHighest,
),
作用:
| 属性 | 含义 |
|---|---|
| borderRadius | 圆角卡片效果 |
| color | 跟随系统主题色 |
这一步非常关键:
- 在 OpenHarmony 上自动适配深色 / 浅色模式
- 与系统视觉风格保持一致
这体现了 Flutter 的 Theme 体系优势。
四、ListView.separated:带分割线列表
ListView.separated(
itemCount: items.length,
separatorBuilder: ...
itemBuilder: ...
)
与 ListView.builder 的区别:
| 类型 | 特点 |
|---|---|
| builder | 纯列表 |
| separated | 列表 + 自动分割线 |
在“设置页”这种场景,separated 是最优选择。
五、关键参数解析
1. shrinkWrap
shrinkWrap: true,
含义:
让 ListView 高度 = 内容高度
适用场景:
- 列表嵌套在
SingleChildScrollView中 - 列表只是页面的一部分,而不是全屏
在 OpenHarmony 上,如果不加这个参数,容易出现:
- 高度撑满
- 布局溢出
- 滚动冲突
2. physics
physics: const NeverScrollableScrollPhysics(),
表示:禁止内部滚动
原因:
- 外层页面可能已经是滚动容器
- 避免多层滚动手势冲突
这是移动端工程实践中非常典型的写法。
六、ListTile:核心组件解析
return ListTile(
leading: Icon(item['icon'] as IconData),
title: Text(item['title'] as String),
subtitle: Text(item['subtitle'] as String),
trailing: const Icon(Icons.chevron_right),
onTap: () {},
);
ListTile 结构模型
| leading | title + subtitle | trailing |
每个字段的作用
| 参数 | 含义 |
|---|---|
| leading | 左侧图标 |
| title | 主标题 |
| subtitle | 副标题 |
| trailing | 右侧图标 |
| onTap | 点击事件 |
这正好对应:
设置页 / 功能入口页 / 信息列表页 的标准交互模型。
七、Divider:分割线设计
Divider(
height: 1,
color: theme.colorScheme.onSurface.withValues(alpha: 0.1),
)
这里有一个非常工程化的细节:
- 使用主题色
- 降低 alpha 到 0.1
- 自动适配深浅模式
这在 OpenHarmony 深色主题下尤其重要,否则分割线会非常突兀。

心得
这个例子虽然简单,但非常“工程化”:
- 数据驱动 UI(items)
- 主题系统统一风格(ThemeData)
- 布局结构清晰(Container → ListView → ListTile)
- 强复用能力(一个方法,全项目可用)
在 Flutter × OpenHarmony 场景中,这种写法的价值非常高:
- 不依赖任何平台 API
- 不涉及鸿蒙特有组件
- 完全可跨 Android / iOS / 鸿蒙
是真正意义上的 一次编写,多端稳定运行。
总结
通过这个 ListTile 示例可以看到,Flutter 在 OpenHarmony 上的开发体验,已经非常接近“纯 Flutter 原生开发”。
ListTile + ListView.separated 这种组合,本质上是:
用极少的代码,表达极高层级的 UI 语义。
对于跨端项目来说,这种模式具备三个核心优势:
- 可维护性高:UI 结构一眼可读
- 一致性强:多端渲染效果统一
- 工程效率极高:无需重复造轮子
在实际项目中,无论是设置页、功能导航页还是个人中心,这一套模式几乎可以作为标准模板直接复用,是真正“生产级别”的 Flutter × OpenHarmony UI 写法。
- 点赞
- 收藏
- 关注作者
评论(0)