Flutter for OpenHarmony音乐播放器App实战14:专辑详情实现
专辑详情页是展示专辑完整信息的页面用户可以查看专辑封面、歌手信息、发行时间以及专辑内的所有歌曲。本篇文章将详细介绍如何使用CustomScrollView和Sliver组件实现一个美观实用的专辑详情页面。页面基础结构专辑详情页使用StatelessWidget因为页面状态相对简单。importpackage:flutter/material.dart;importpackage:get/get.dart;classAlbumDetailPageextendsStatelessWidget{finalint id;constAlbumDetailPage({super.key,requiredthis.id});页面通过构造函数接收专辑ID用于加载对应的专辑数据。如果需要管理收藏状态等可以改为StatefulWidget。CustomScrollView结构使用CustomScrollView组合多个Sliver组件。overrideWidgetbuild(BuildContextcontext){returnScaffold(body:CustomScrollView(slivers:[_buildSliverAppBar(),_buildActionBar(),_buildSongList(),],),);}CustomScrollView允许将多个Sliver组件组合在一起滚动。页面包含三个部分可折叠的头部、操作按钮栏和歌曲列表。SliverAppBar头部设计SliverAppBar实现可折叠的专辑信息头部。Widget_buildSliverAppBar(){returnSliverAppBar(expandedHeight:300,pinned:true,flexibleSpace:FlexibleSpaceBar(background:Container(decoration:BoxDecoration(gradient:LinearGradient(begin:Alignment.topCenter,end:Alignment.bottomCenter,colors:[Colors.primaries[id%Colors.primaries.length],Colors.black,],),),expandedHeight设置展开高度为300pinned为true让AppBar收起后固定在顶部。背景使用渐变色从专辑主题色过渡到黑色。专辑封面与信息头部展示专辑封面和基本信息。child:SafeArea(child:Padding(padding:constEdgeInsets.all(20),child:Row(crossAxisAlignment:CrossAxisAlignment.end,children:[Container(width:150,height:150,decoration:BoxDecoration(borderRadius:BorderRadius.circular(12),color:Colors.white24,boxShadow:[BoxShadow(color:Colors.black.withOpacity(0.3),blurRadius:20,offset:constOffset(0,10),),],),child:constIcon(Icons.album,size:70,color:Colors.white70),),封面使用圆角矩形添加阴影增加立体感。实际项目中会使用网络图片替换Icon。专辑文字信息封面右侧显示专辑名称、歌手和发行时间。constSizedBox(width:16),Expanded(child:Column(mainAxisAlignment:MainAxisAlignment.end,crossAxisAlignment:CrossAxisAlignment.start,children:[Text(专辑${id1},style:constTextStyle(color:Colors.white,fontSize:22,fontWeight:FontWeight.bold,),),constSizedBox(height:8),GestureDetector(onTap:()Get.toNamed(/artist/$id),child:constText(歌手名称,style:TextStyle(color:Colors.white70),),),constSizedBox(height:4),Text(发行时间:${2020id%5}年,style:constTextStyle(color:Colors.white54,fontSize:12),),],),),],),),),),),);}歌手名称可点击跳转到歌手详情页。使用不同透明度的白色区分信息层级。操作按钮栏操作栏包含播放全部、收藏和分享按钮。Widget_buildActionBar(){returnSliverToBoxAdapter(child:Padding(padding:constEdgeInsets.all(16),child:Row(children:[Expanded(child:ElevatedButton.icon(onPressed:()_playAll(),icon:constIcon(Icons.play_arrow),label:constText(播放全部),style:ElevatedButton.styleFrom(backgroundColor:constColor(0xFFE91E63),foregroundColor:Colors.white,padding:constEdgeInsets.symmetric(vertical:12),shape:RoundedRectangleBorder(borderRadius:BorderRadius.circular(25),),),),),constSizedBox(width:12),IconButton(icon:constIcon(Icons.favorite_border),onPressed:()_toggleFavorite(),),IconButton(icon:constIcon(Icons.share),onPressed:()_shareAlbum(),),],),),);}播放全部按钮使用主题色占据大部分宽度。收藏和分享使用图标按钮节省空间。歌曲列表使用SliverList构建歌曲列表。Widget_buildSongList(){returnSliverList(delegate:SliverChildBuilderDelegate((context,index)_buildSongItem(index),childCount:10,),);}SliverChildBuilderDelegate实现懒加载只构建可见的列表项。childCount设置歌曲总数。歌曲列表项每首歌曲显示序号、名称、歌手和时长。Widget_buildSongItem(int index){returnListTile(leading:Container(width:32,alignment:Alignment.center,child:Text(${index1},style:TextStyle(color:index3?constColor(0xFFE91E63):Colors.grey,fontWeight:index3?FontWeight.bold:FontWeight.normal,),),),title:Text(歌曲${index1},maxLines:1,overflow:TextOverflow.ellipsis,),subtitle:constText(歌手名称,style:TextStyle(color:Colors.grey,fontSize:12),),trailing:Row(mainAxisSize:MainAxisSize.min,children:[constText(04:32,style:TextStyle(color:Colors.grey,fontSize:12),),IconButton(icon:constIcon(Icons.more_vert,color:Colors.grey),onPressed:()_showSongOptions(index),),],),onTap:()_playSong(index),);}前三首歌曲的序号使用主题色突出显示。trailing包含时长和更多操作按钮。歌曲操作菜单点击更多按钮显示操作菜单。void_showSongOptions(int index){Get.bottomSheet(Container(decoration:constBoxDecoration(color:Color(0xFF1E1E1E),borderRadius:BorderRadius.vertical(top:Radius.circular(16)),),child:Column(mainAxisSize:MainAxisSize.min,children:[ListTile(leading:Container(width:50,height:50,decoration:BoxDecoration(borderRadius:BorderRadius.circular(8),color:Colors.grey.withOpacity(0.3),),child:constIcon(Icons.music_note,color:Colors.white70),),title:Text(歌曲${index1}),subtitle:constText(歌手名称,style:TextStyle(color:Colors.grey)),),constDivider(),ListTile(leading:constIcon(Icons.play_circle_outline),title:constText(下一首播放),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.playlist_add),title:constText(添加到歌单),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.download_outlined),title:constText(下载),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.share_outlined),title:constText(分享),onTap:()Get.back(),),constSizedBox(height:16),],),),);}菜单顶部显示歌曲信息下方是各种操作选项。这种设计让用户在操作前可以确认选中的歌曲。播放全部方法点击播放全部按钮后播放专辑内所有歌曲。void_playAll(){Get.toNamed(/player,arguments:{albumId:id,startIndex:0,});Get.snackbar(播放,开始播放专辑,snackPosition:SnackPosition.BOTTOM,);}跳转到播放器页面传递专辑ID和起始索引。播放单曲方法点击单曲后从该歌曲开始播放。void_playSong(int index){Get.toNamed(/player,arguments:{albumId:id,startIndex:index,});}传递起始索引播放器会从该歌曲开始播放专辑。收藏专辑方法收藏按钮的点击处理。void_toggleFavorite(){// 实际项目中需要调用API并更新状态Get.snackbar(收藏,已添加到收藏,snackPosition:SnackPosition.BOTTOM,);}实际项目中需要调用API更新收藏状态并使用状态管理更新UI。分享专辑方法分享按钮的点击处理。void_shareAlbum(){Get.bottomSheet(Container(decoration:constBoxDecoration(color:Color(0xFF1E1E1E),borderRadius:BorderRadius.vertical(top:Radius.circular(16)),),child:Column(mainAxisSize:MainAxisSize.min,children:[constPadding(padding:EdgeInsets.all(16),child:Text(分享到,style:TextStyle(fontSize:18,fontWeight:FontWeight.bold)),),Row(mainAxisAlignment:MainAxisAlignment.spaceEvenly,children:[_buildShareItem(Icons.chat,微信),_buildShareItem(Icons.people,朋友圈),_buildShareItem(Icons.message,微博),_buildShareItem(Icons.link,复制链接),],),constSizedBox(height:24),],),),);}Widget_buildShareItem(IconDataicon,Stringlabel){returnGestureDetector(onTap:(){Get.back();Get.snackbar(分享,分享到$label);},child:Column(children:[Container(width:50,height:50,decoration:BoxDecoration(color:Colors.grey.withOpacity(0.3),shape:BoxShape.circle,),child:Icon(icon,color:Colors.white70),),constSizedBox(height:8),Text(label,style:constTextStyle(fontSize:12)),],),);}分享菜单显示常用的分享渠道点击后执行对应的分享操作。专辑简介区域可以在歌曲列表前添加专辑简介。Widget_buildAlbumDescription(){returnSliverToBoxAdapter(child:Padding(padding:constEdgeInsets.all(16),child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[constText(专辑简介,style:TextStyle(fontSize:16,fontWeight:FontWeight.bold),),constSizedBox(height:8),constText(这是一张非常棒的专辑收录了歌手的多首经典作品。专辑风格多样既有抒情慢歌也有动感快歌值得细细品味。,style:TextStyle(color:Colors.grey,height:1.6),maxLines:3,overflow:TextOverflow.ellipsis,),GestureDetector(onTap:()_showFullDescription(),child:constText(展开,style:TextStyle(color:Color(0xFFE91E63)),),),],),),);}简介默认显示3行点击展开可以查看完整内容。歌曲列表头部在歌曲列表前添加头部信息。Widget_buildSongListHeader(){returnSliverToBoxAdapter(child:Padding(padding:constEdgeInsets.symmetric(horizontal:16,vertical:8),child:Row(children:[constText(歌曲列表,style:TextStyle(fontSize:16,fontWeight:FontWeight.bold),),constSizedBox(width:8),Text(共10首,style:TextStyle(color:Colors.grey.withOpacity(0.8),fontSize:14),),],),),);}显示歌曲列表标题和歌曲总数让用户了解专辑包含多少首歌。评论入口可以添加评论入口让用户查看和发表评论。Widget_buildCommentEntry(){returnSliverToBoxAdapter(child:ListTile(leading:constIcon(Icons.comment_outlined,color:Colors.grey),title:constText(评论),subtitle:constText(1234条评论,style:TextStyle(color:Colors.grey,fontSize:12)),trailing:constIcon(Icons.chevron_right,color:Colors.grey),onTap:()Get.toNamed(/comment,arguments:{albumId:id}),),);}显示评论数量点击跳转到评论页面。总结专辑详情页的实现使用了CustomScrollView和多个Sliver组件的组合SliverAppBar实现可折叠的头部SliverToBoxAdapter包装普通WidgetSliverList构建歌曲列表。通过合理的布局和交互设计为用户提供了清晰的专辑信息展示和便捷的操作入口。在实际项目中还需要对接后端接口获取真实的专辑数据。欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

告别贸易商截流!直接和工厂老板谈采购更划算

告别贸易商截流!直接和工厂老板谈采购更划算

在制造业采购工作当中,有一个隐蔽但却普遍存在的痛点长期以来被人们忽视了:你心里以为对接的是“源头厂家”,但实际上却被贸易商一层又一层地截流,他们在价格上加价10%–30%,不承担质量方面的责任,一旦出现…

2026/7/3 15:11:38 阅读更多 →
【无人机三维路径规划】基于dijkstra师范的无人机三维路径规划动态避障附matlab代码

【无人机三维路径规划】基于dijkstra师范的无人机三维路径规划动态避障附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/7/3 15:11:38 阅读更多 →
收藏备用|大模型6大核心职业方向拆解,小白程序员也能快速入局

收藏备用|大模型6大核心职业方向拆解,小白程序员也能快速入局

当下,大模型技术正以不可阻挡之势渗透各行各业,从日常智能交互到产业深度升级,其应用身影无处不在,更给程序员群体开辟了一条全新的职业上升赛道,成为转型加薪的核心突破口。本文专为想要转型大模型领域的小白程序员、…

2026/7/3 15:11:41 阅读更多 →

最新新闻

AI赋能传染病建模:从数据到动力学模型的本地实践指南

AI赋能传染病建模:从数据到动力学模型的本地实践指南

这次我们来看一个将 AI 与传染病动力学建模结合的前沿方向。想象一下,你手头有一份流感爆发的病例数据,传统的建模方法可能需要复杂的微分方程和大量的手动调参,而 AI 模型能否直接从数据中“学习”出传播规律,甚至自动跑通整个建…

2026/7/5 0:07:38 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
Solidity 访问控制:onlyOwner 不是权限体系

Solidity 访问控制:onlyOwner 不是权限体系

Solidity 访问控制:onlyOwner 不是权限体系 一、单一 owner 很容易变成单点风险 很多 Solidity 合约早期会用 onlyOwner 解决权限问题。部署者可以升级参数、提取资金、暂停合约。简单项目这样写很快,但资产规模和协作人数上来后,单一 owner …

2026/7/4 23:59:31 阅读更多 →
终极AMD Ryzen调试指南:如何用免费开源工具深度掌控你的处理器性能?

终极AMD Ryzen调试指南:如何用免费开源工具深度掌控你的处理器性能?

终极AMD Ryzen调试指南:如何用免费开源工具深度掌控你的处理器性能? 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table…

2026/7/4 23:57:30 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻