基于HarmonyOS 7.0 跨端开发的有声书进度跟踪页面实战

前言

媒体跟踪类应用的核心,是把"进度"这个概念清晰地可视化,并帮用户管理多个内容的进度状态。有声书进度跟踪就是典型:用户在听多本书,每本进度不同,应用要展示正在播放的、书架上各书的进度、以及整体的收听统计。本文以一个真实的有声书进度跟踪页面(入口类 ProfilePage)为样本,深入剖析它如何在 Flutter × HarmonyOS 7.0 架构下,用正在播放卡、带进度角标的书架网格与收听统计面板,把"听书进度跨设备同步与统计"的播放器体验完整落地。这是一个把"进度可视化"与"完成态区分"结合得很清晰的页面,通过拆解它,我们能透彻理解 Flutter 的进度条、Stack 角标、完成态差异渲染以及音频播放、跨设备同步等能力的跨端落地。
在这里插入图片描述

背景

有声书工具的核心是"看进度、管书架、查统计":展示正在播放的书(封面、章节、进度条、剩余时长),用书架网格管理所有书(封面、进度、剩余,已听完的有特殊标识),并统计收听时长、已听完本数、连续天数等。本页面在视觉上采用有声书播放器风格,深蓝背景(0xFF1A1A2E)配温暖橙主色(0xFFF97316)。结构上从上到下依次是:标题栏(带本月时长)、正在播放卡(封面 + 书名章节 + 进度条 + 剩余时长)、书架三列网格(每本含封面、进度、剩余,已听完的加绿框与对勾角标),以及收听统计面板。其中进度用 LinearProgressIndicator、已听完用 Stack 角标与边框区分,是进度可视化与完成态渲染的典型示范。

Flutter × Harmony7.0 跨端开发介绍

在 HarmonyOS 7.0 上运行本页面,前提是使用 HarmonyOS 维护的定制版 Flutter SDK,因为鸿蒙对 Flutter 的支持是由 HarmonyOS 跨平台 SIG 通过 fork 扩展 Flutter SDK 实现的。

本页面有两个重要的跨端要点。其一是音频播放:有声书的实际播放需要音频解码与播放能力,Flutter 的 Dart 层需通过 Platform Channel 调用鸿蒙的音频播放框架(AVPlayer),或使用已适配鸿蒙的音频插件(如 audioplayersjust_audio 的 ohos 版本)。其二是跨设备同步——这正是 HarmonyOS 的特色能力:鸿蒙的分布式能力(分布式数据管理)让听书进度能在手机、平板、车机间无缝流转,这需要通过 Platform Channel 接入鸿蒙的分布式数据服务。本示例聚焦于进度展示与书架管理的交互层,播放与同步是预设状态,但页面已把进度数据组织得很清晰,便于对接真实播放与同步能力。

整页渲染经 Skia 借助鸿蒙 ArkUI RenderingContext 完成,进度条、网格渲染流畅。

开发核心代码

第一部分:LinearProgressIndicator 进度可视化。 正在播放卡用进度条 + 百分比 + 剩余时长三重展示进度:

ClipRRect(
  borderRadius: BorderRadius.circular(3),
  child: LinearProgressIndicator(
    value: 0.72,                                   // 进度 0~1
    backgroundColor: const Color(0xFF2A2A4A),
    color: _audioPrimary, minHeight: 4),
),
Row(children: [
  const Text('72%', style: TextStyle(color: _audioPrimary)),   // 百分比
  const Spacer(),
  Text('剩余 5h20m'),                                            // 剩余时长
])

LinearProgressIndicatorvalue 取 0~1 直接对应播放进度,ClipRRect 给它加圆角让进度条更精致。进度同时用进度条(直观)、百分比(精确)、剩余时长(实用)三种形式展示,满足用户对进度的不同关注角度。这是媒体播放进度展示的标准组合。

第二部分:完成态的差异化渲染。 书架里已听完的书用绿色边框、绿色底色、对勾角标区分:

..._books.map((b) {
  final p = b['progress'] as double;
  final done = p >= 1.0;   // 进度满则为已完成
  return Container(
    decoration: BoxDecoration(
      border: Border.all(color: done
          ? const Color(0x3310B981) : const Color(0xFF2A2A4A))),  // 完成绿框
    child: Column(children: [
      Stack(children: [
        Container(/* 封面 */),
        if (done) const Positioned(top: 4, right: 4, child: Text('✅')),  // 完成角标
      ]),
      Text(b['remaining'] as String,
          style: TextStyle(color: done ? const Color(0xFF10B981) : const Color(0xFF6A6A8A))),
    ]),
  );
})

p >= 1.0 判断是否听完,已完成的书用绿色边框、对勾角标、绿色"已听完"文字多重标识。Stack + Positioned 把对勾角标钉在封面右上角。这种"完成态全方位绿色化"的处理,让用户一眼就能在书架里区分听完的和在听的,是状态可视化的有效手法。
在这里插入图片描述

第三部分:Stack 定位完成角标。Stack + Positioned 把对勾角标叠在封面右上角:

Stack(children: [
  Container(width: double.infinity, height: 80, /* 封面 */),
  if (done)
    const Positioned(top: 4, right: 4, child: Text('✅', style: TextStyle(fontSize: 14))),
])

Stack 让对勾能叠在封面之上,Positioned(top: 4, right: 4) 把它精确定位到右上角。角标只在 done 时通过集合 if 条件渲染。这种"在卡片角落叠加状态角标"的模式,在已读标记、新内容提示、VIP 标识等场景里极为常用。

心得

做这个有声书进度页面,最大的收获是体会到"进度"这一概念的多维度可视化。同一个 72% 的进度,我用了三种形式展示:进度条让用户直观感受"走了多少",百分比给出精确数值,剩余时长则告诉用户"还要听多久"。这三者满足的是用户对进度的不同关注点——有人想看整体进展、有人想知道确切数字、有人关心还需投入多少时间。把一个进度数据用多种互补的形式呈现,信息密度和实用性都大大提升。这让我意识到,好的数据可视化不是把数据展示一遍就完了,而是要理解用户会从哪些角度关心这个数据,然后用对应的形式分别满足。进度、评分、价格这类核心数据,都值得这样多维度地呈现。

第二个体会是完成态的全方位差异化渲染。书架里已听完的书,我没有只在某一处标个"完成",而是用了绿色边框、绿色底色、对勾角标、绿色文字这一整套绿色化处理。这种"全方位"的状态标识看似冗余,实则很有必要——它让"已完成"这个状态在视觉上足够强烈、足够一致,用户扫一眼就能在一堆书里立刻识别出听完的那些。如果只在角落标个小小的对勾,在网格里很容易被忽略。这让我体会到,对于需要快速识别的重要状态,多重视觉线索的叠加是值得的——边框、底色、角标、文字色协同传达同一个状态,识别效率远高于单一标识。当然,要注意所有这些线索都从同一个 done 判断派生,保证一致性。

第三个深刻的体会是关于有声书应用的两大跨端要点:音频播放与跨设备同步。音频播放是基础能力,得通过 Platform Channel 接入鸿蒙的 AVPlayer 或用适配的音频插件。而跨设备同步则让我特别兴奋——这恰恰是 HarmonyOS 的招牌能力。鸿蒙的分布式数据管理能让听书进度在手机、平板、车机之间无缝流转:在手机上听到第 24 章,上车后车机自动接着播。这是鸿蒙生态相比其它平台的独特优势,而 Flutter 应用要用上它,需要通过 Platform Channel 接入鸿蒙的分布式数据服务。写这个页面让我意识到,跨端开发不只是"在鸿蒙上跑起来",更可以"用上鸿蒙的特色能力"——对有声书这种多设备场景的应用,鸿蒙的分布式同步能力是巨大的加分项。所以做鸿蒙应用时,除了保证基础功能跨端复用,还应主动思考如何借助 Platform Channel 调用鸿蒙独有的分布式、流转能力,把跨端从"兼容"提升到"增值"。

总结

这个有声书进度跟踪页面完整呈现了 Flutter 在 HarmonyOS 7.0 上构建媒体跟踪型页面的标准做法:用 LinearProgressIndicator 配合百分比、剩余时长多维度可视化进度,用绿色边框、角标、文字多重线索标识完成态,用 Stack + Positioned 定位状态角标。整个页面把"多内容的进度管理"处理得清晰而实用——进度多维呈现满足不同关注角度,完成态全方位标识便于快速识别,状态从单一判断派生保证一致。这种范式对有声书、视频、课程、播客等各类需要"进度跟踪 + 完成管理"的媒体应用都有很强的复用价值。

从跨端落地的角度看,本页面的进度展示与书架管理层是纯 Dart 实现、可零适配复用的:正在播放卡、书架网格、统计面板全部使用 Flutter 内置组件,切换到 HarmonyOS 提供的定制版 SDK 后即可在鸿蒙设备上直接运行。而它真正需要平台协作的有两块:音频播放需通过 Platform Channel 接入鸿蒙的 AVPlayer 或适配的音频插件;尤其值得一提的是跨设备同步——这是 HarmonyOS 的特色分布式能力,让听书进度能在手机、平板、车机间无缝流转,需通过 Platform Channel 接入鸿蒙的分布式数据服务。这正体现了 Flutter × HarmonyOS 的独特价值:不仅把展示逻辑用纯 Dart 跨端共享,更能借助 Platform Channel 调用鸿蒙独有的分布式流转能力,让应用在多设备场景下获得超越其它平台的体验。对于有声书这类多设备使用的应用而言,把握好"展示层零适配、播放层适配、同步层用鸿蒙分布式增值"这一分工,是这类应用在鸿蒙生态里既快速落地又脱颖而出的关键工程策略。
在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐