「忆影 · MemoPlay」——基于 Flutter × HarmonyOS 6.0 的沉浸式视频播放器


前言

在视频类应用中,分类导航是用户体验的第一入口
无论是抖音、B 站、腾讯视频还是 YouTube,用户的第一步永远是:

我想看什么类型的内容?

如果分类设计混乱,用户找不到内容,再强的推荐算法也毫无意义。

本文基于一个完整的跨端项目 「忆影 MemoPlay」视频播放器,详细讲解如何在:

  • Flutter
  • HarmonyOS 6.0(鸿蒙 Next / ArkUI Stage Model)

环境下,实现一个:

高性能、可扩展、状态联动清晰的横向分类导航组件

并对核心代码进行逐行深度解析。


背景

为什么要做一个「分类导航模块」?

在视频产品中,分类模块承担三个核心职责:

职责 说明
信息架构 让内容可被理解
导航入口 让用户快速定位
状态过滤 驱动内容筛选逻辑

而在跨端架构中,它还多了一个使命:

作为 Flutter 与 HarmonyOS 原生体验一致性的验证点

因为分类组件涉及:

  • 滚动性能
  • 手势响应
  • 状态管理
  • 主题适配(深色 / 浅色)
  • 屏幕尺寸适配(手机 / Pad / 折叠屏)

是最容易暴露跨端问题的模块之一。


在这里插入图片描述

Flutter × HarmonyOS 6.0 跨端开发介绍

技术架构

本项目采用:

Flutter UI 层
   ↓
Flutter Engine for HarmonyOS
   ↓
OpenHarmony Ark Runtime
   ↓
鸿蒙系统能力(分布式、窗口管理、硬件加速)

HarmonyOS 6.0 对 Flutter 的支持特点:

能力 说明
原生渲染 Skia 直接接入鸿蒙图形栈
无 WebView 套壳 真·原生性能
多窗口适配 自然支持平板/折叠
分布式能力 可扩展为多端视频同步

对 Flutter 来说,本质上:

HarmonyOS = 一个更现代的 Android Runtime

几乎不需要改一行业务代码。


在这里插入图片描述

分类导航设计目标

在 MemoPlay 中,分类导航模块的设计目标是:

  1. 横向滑动
  2. 支持选中 / 取消选中
  3. 状态联动视频列表
  4. 高度可复用
  5. 主题自适应(亮/暗)

UI 结构示意:

分类
[电影] [电视剧] [动漫] [纪录片] [综艺] ...

开发核心代码(完整深度解析)

在这里插入图片描述

一、分类导航整体结构

/// 构建分类导航
Widget _buildCategoryNavigation(ThemeData theme) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Text(
        '分类',
        style: theme.textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
      ),
      const SizedBox(height: 16),
      SizedBox(
        height: 100,
        child: ListView.builder(
          scrollDirection: Axis.horizontal,
          itemCount: _categories.length,
          itemBuilder: (context, index) {
            final category = _categories[index];
            return _buildCategoryItem(category, theme);
          },
        ),
      ),
    ],
  );
}

逐行解析(架构级)

1. Column:垂直布局容器
return Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  • 外层使用 Column
  • 上面是标题
  • 下面是横向分类列表
  • 经典「标题 + 内容区」布局范式

2. 标题文本
Text(
  '分类',
  style: theme.textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
),

设计要点:

  • 使用 ThemeData,而不是写死样式
  • 自动适配 HarmonyOS 深色模式
  • 遵循 Material 3 规范

这是跨端项目的关键原则:

一切样式必须走主题系统


3. 横向 ListView
SizedBox(
  height: 100,
  child: ListView.builder(
    scrollDirection: Axis.horizontal,

这里是整个分类导航的灵魂:

设计点 说明
SizedBox 固定高度,避免布局抖动
horizontal 横向滑动
builder 虚拟列表,性能友好

在 HarmonyOS 大屏设备上:

  • 横向滚动体验比纵向更自然
  • 可扩展为 TV 模式

二、单个分类项组件

Widget _buildCategoryItem(VideoCategory category, ThemeData theme) {
  final isSelected = _selectedCategory == category;

这里开始进入状态逻辑层。


状态判断

final isSelected = _selectedCategory == category;

这是整个组件的核心状态源:

UI 是否高亮
      ↑
_selectedCategory

属于典型的:

受控组件模式(Controlled Widget)


点击逻辑

return GestureDetector(
  onTap: () {
    setState(() {
      _selectedCategory = isSelected ? null : category;
      _selectedTag = null;
    });
  },

设计亮点:

行为 说明
再次点击 取消选中
选中分类 清空标签
setState 触发全 UI 刷新

这是一个非常成熟的交互逻辑:

分类 = 一级过滤
Tag = 二级过滤
切分类时,标签必须重置


三、分类项 UI 构建

圆形图标容器

Container(
  width: 64,
  height: 64,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(32),
    color: isSelected 
        ? theme.colorScheme.primary 
        : theme.colorScheme.surfaceVariant,
  ),

这里体现的是:

状态驱动 UI

状态 背景色
选中 主色
未选中 surfaceVariant

HarmonyOS 深色模式下会自动变色。


图标颜色联动

Icon(
  Icons.video_library,
  size: 32,
  color: isSelected 
      ? theme.colorScheme.onPrimary 
      : theme.colorScheme.onSurfaceVariant,
),

遵循 Material 设计规范:

  • onPrimary:主色上的文字颜色
  • onSurfaceVariant:灰底上的文字颜色

这是真正的设计系统级开发,而不是写死 Colors.white


分类文字样式

Text(
  category.name,
  style: theme.textTheme.bodySmall?.copyWith(
    fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
    color: isSelected 
        ? theme.colorScheme.primary 
        : theme.colorScheme.onSurface,
  ),

视觉层级非常清晰:

选中状态 效果
true 加粗 + 主色
false 普通 + 默认色

这就是专业产品级交互细节。


架构总结:这是一个标准状态驱动组件

该组件完整符合现代 Flutter 架构范式:

State (selectedCategory)
        ↓
UI render
        ↓
User tap
        ↓
setState
        ↓
State change

属于典型的:

单向数据流 + 声明式 UI

在 HarmonyOS 上优势尤其明显:

  • 无需关心生命周期差异
  • 无需适配鸿蒙控件体系
  • 一套代码,全平台一致

在这里插入图片描述

心得(真实工程经验)

在 HarmonyOS + Flutter 项目中,我最大的三个感受:

1. Flutter 是真正的“系统级跨端”

不是 WebView 套壳,而是:

  • 原生渲染
  • 原生手势
  • 原生性能

在鸿蒙设备上滑动体验几乎和原生 ArkUI 无差别。


2. 分类导航是最容易写烂的模块

很多人会写成:

  • 写死宽高
  • 写死颜色
  • 不支持取消选中
  • 状态混乱

但真正专业实现必须:

  • 状态唯一
  • 样式走 Theme
  • 逻辑可扩展
  • 组件可复用

3. 跨端项目的核心不是“能跑”

而是:

在不同系统上跑得一样自然

这套分类组件在:

  • Android
  • iOS
  • HarmonyOS
  • Pad
  • 折叠屏

全部无需改一行代码。


在这里插入图片描述

总结

「忆影 MemoPlay」视频播放器项目中,分类导航模块看似只是一个小组件,但实际上它体现了:

  • Flutter 声明式 UI 的工程优势
  • HarmonyOS 6.0 对跨端的成熟支持
  • 状态驱动架构的长期可维护性
  • 产品级交互设计的专业度

一句话总结:

分类导航不是 UI 组件,而是信息架构与用户体验的第一道门。
在 Flutter × HarmonyOS 的组合下,我们终于可以用“一套代码”,交付“多端原生级体验”。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐