Flutter for OpenHarmony音乐播放器App实战24:我喜欢的音乐实现
我喜欢的音乐是用户收藏歌曲的专属歌单用户可以在这里找到所有标记为喜欢的歌曲。本篇将详细介绍如何实现我喜欢的音乐页面包括歌单头部设计、排序功能和歌曲操作菜单。功能分析我喜欢的音乐页面需要实现以下功能渐变封面展示、歌曲数量统计、排序方式选择、歌曲列表展示、喜欢状态切换、歌曲操作菜单。这个页面是用户管理收藏歌曲的核心入口。核心技术点本篇涉及的核心技术包括StatelessWidget页面构建、LinearGradient渐变背景、ListView.builder列表构建、showModalBottomSheet底部弹窗、GetX路由导航。对应代码文件lib/pages/favorite/favorite_page.dart完整代码实现importpackage:flutter/material.dart;importpackage:get/get.dart;classFavoritePageextendsStatelessWidget{constFavoritePage({super.key});overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(我喜欢的音乐),这段代码导入了Flutter核心库和GetX状态管理库。FavoritePage继承StatelessWidget因为页面状态相对简单。Scaffold提供基础页面结构AppBar显示我喜欢的音乐标题。actions:[IconButton(icon:constIcon(Icons.sort),onPressed:()_showSortOptions(context),),IconButton(icon:constIcon(Icons.play_circle_filled),onPressed:(){},),],),body:Column(children:[_buildHeader(),Expanded(child:_buildSongList()),],),);}actions数组添加两个操作按钮排序按钮和播放全部按钮。排序按钮点击后显示排序选项菜单播放按钮可以直接播放全部喜欢的歌曲。body使用Column垂直排列头部和列表Expanded让列表占据剩余空间。Widget_buildHeader(){returnContainer(padding:constEdgeInsets.all(16),child:Row(children:[Container(width:120,height:120,decoration:BoxDecoration(borderRadius:BorderRadius.circular(12),gradient:constLinearGradient(colors:[Color(0xFFE91E63),Color(0xFFFF5722)],),),child:constIcon(Icons.favorite,size:60,color:Colors.white),),_buildHeader方法构建歌单头部。封面使用120x120像素的圆角容器LinearGradient创建从粉色到橙色的渐变背景。中央显示白色爱心图标突出我喜欢的主题。这种渐变设计让封面更加温暖有活力。constSizedBox(width:16),constExpanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[Text(我喜欢的音乐,style:TextStyle(fontSize:20,fontWeight:FontWeight.bold),),SizedBox(height:8),Text(共 128 首,style:TextStyle(color:Colors.grey),),SizedBox(height:8),Text(最近更新: 今天,style:TextStyle(color:Colors.grey,fontSize:12),),],),),],),);}封面右侧使用Column垂直排列歌单信息。crossAxisAlignment设为start让文字左对齐。显示歌单名称、歌曲总数和最近更新时间让用户快速了解歌单的基本情况。Expanded让信息区域占据剩余宽度。Widget_buildSongList(){finalsongsList.generate(20,(i){title:喜欢的歌曲${i1},artist:歌手${i%51},album:专辑${i%31},});returnListView.builder(itemCount:songs.length,itemBuilder:(context,index){finalsongsongs[index];returnListTile(leading:Container(width:50,height:50,_buildSongList方法构建歌曲列表。List.generate生成20首模拟歌曲数据实际项目中应从数据库或API获取。ListView.builder采用懒加载方式构建列表只渲染可见区域的列表项性能更好。decoration:BoxDecoration(color:Colors.primaries[index%Colors.primaries.length].withOpacity(0.3),borderRadius:BorderRadius.circular(8),),child:constIcon(Icons.music_note,color:Colors.white),),title:Text(song[title]!,maxLines:1,overflow:TextOverflow.ellipsis,),subtitle:Text(${song[artist]} - ${song[album]},style:constTextStyle(color:Colors.grey,fontSize:12),),leading放置歌曲封面使用50x50像素的圆角容器。背景色从primaries颜色列表循环取值让每首歌有不同的颜色。title显示歌曲名称maxLines限制一行overflow设置溢出显示省略号。subtitle显示歌手和专辑信息。trailing:Row(mainAxisSize:MainAxisSize.min,children:[IconButton(icon:constIcon(Icons.favorite,color:Color(0xFFE91E63),size:20,),onPressed:(){},),IconButton(icon:constIcon(Icons.more_vert,size:20),onPressed:()_showSongOptions(context),),],),onTap:(){},);},);}trailing放置操作按钮区域。Row使用mainAxisSize.min让宽度自适应内容。喜欢按钮显示粉色实心爱心表示已喜欢状态。更多按钮点击后显示操作菜单。onTap处理列表项点击可以跳转到播放器页面。void_showSortOptions(BuildContextcontext){showModalBottomSheet(context:context,backgroundColor:constColor(0xFF1E1E1E),builder:(context)Column(mainAxisSize:MainAxisSize.min,children:[constPadding(padding:EdgeInsets.all(16),child:Text(排序方式,style:TextStyle(fontSize:18,fontWeight:FontWeight.bold),),),_showSortOptions方法显示排序选项菜单。showModalBottomSheet创建底部弹窗backgroundColor设置深色背景。Column使用mainAxisSize.min让高度自适应内容。顶部显示排序方式标题。ListTile(leading:constIcon(Icons.access_time),title:constText(按添加时间),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.sort_by_alpha),title:constText(按歌曲名),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.person),title:constText(按歌手),onTap:()Get.back(),),constSizedBox(height:16),],),);}提供三种排序方式按添加时间、按歌曲名、按歌手。每个选项使用ListTile构建leading显示图标title显示文字。点击后调用Get.back()关闭弹窗。实际项目中需要在点击后执行排序逻辑并刷新列表。void_showSongOptions(BuildContextcontext){showModalBottomSheet(context:context,backgroundColor:constColor(0xFF1E1E1E),builder:(context)Column(mainAxisSize:MainAxisSize.min,children:[ListTile(leading:constIcon(Icons.playlist_add),title:constText(添加到歌单),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.download),title:constText(下载),onTap:()Get.back(),),_showSongOptions方法显示歌曲操作菜单。菜单包含添加到歌单、下载、分享和取消喜欢四个选项。每个选项使用ListTile构建点击后关闭弹窗并执行对应操作。ListTile(leading:constIcon(Icons.share),title:constText(分享),onTap:()Get.back(),),ListTile(leading:constIcon(Icons.delete,color:Colors.red),title:constText(取消喜欢,style:TextStyle(color:Colors.red)),onTap:()Get.back(),),constSizedBox(height:16),],),);}}取消喜欢选项使用红色图标和文字提醒用户这是移除操作。点击后应该弹出确认对话框避免用户误操作。SizedBox在底部添加间距让菜单看起来更舒适。渐变封面设计封面使用LinearGradient创建渐变背景从粉色(E91E63)过渡到橙色(FF5722)。这种暖色调渐变配合爱心图标很好地表达了喜欢的主题。borderRadius.circular(12)让封面呈圆角矩形视觉效果更加柔和。ListView.builder列表构建ListView.builder是构建长列表的最佳选择它采用懒加载方式只构建可见区域的列表项。itemCount指定列表项总数itemBuilder构建每个列表项。这种方式比直接使用ListView.children性能更好特别是当列表项很多时。ListTile列表项组件ListTile是Flutter提供的标准列表项组件包含leading、title、subtitle、trailing四个区域。leading通常放置图标或头像title显示主要文字subtitle显示辅助信息trailing放置操作按钮。使用ListTile可以快速构建规范的列表界面。showModalBottomSheet底部弹窗showModalBottomSheet用于显示底部弹出菜单是移动端常见的交互方式。backgroundColor设置弹窗背景色builder构建弹窗内容。弹窗会自动处理手势关闭也可以通过Get.back()或Navigator.pop()手动关闭。小结本篇实现了音乐播放器的我喜欢的音乐页面。通过渐变封面和爱心图标突出喜欢的主题ListView.builder高效构建歌曲列表底部弹窗提供排序和歌曲操作功能。这种设计模式在音乐App中非常常见用户可以方便地管理自己收藏的歌曲。欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

【图像加密】基于Arnold 变换的图像加密与解密算法研究附matlab代码

【图像加密】基于Arnold 变换的图像加密与解密算法研究附matlab代码

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

2026/7/3 15:11:51 阅读更多 →
【计算机毕业设计案例】基于Vue.js和Node.js线上美术馆网站平台(程序+文档+讲解+定制)

【计算机毕业设计案例】基于Vue.js和Node.js线上美术馆网站平台(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 15:11:52 阅读更多 →
【课程设计/毕业设计】基于.Net智慧阅读书城系统的设计与实现基于net的网上书城系统线上阳光好书系统【附源码、数据库、万字文档】

【课程设计/毕业设计】基于.Net智慧阅读书城系统的设计与实现基于net的网上书城系统线上阳光好书系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

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

最新新闻

Redis Stream 消息队列总结

Redis Stream 消息队列总结

1. Stream 是什么Redis Stream 是 Redis 提供的一种消息队列数据结构,用于保存和传递一系列消息。它的核心特点是:消息有唯一 ID。消息会持久化保存在 Redis 中,不会像 Pub/Sub 一样发送后立刻丢失。支持消费者组。支持消息确认机制。支持查看…

2026/7/5 1:52:27 阅读更多 →
【大白话说Java面试题 第153题】【06_Spring篇】第13题:Spring 中 Bean 是线程安全的吗?

【大白话说Java面试题 第153题】【06_Spring篇】第13题:Spring 中 Bean 是线程安全的吗?

📌 PDF:大白话说Java面试题 — 06_Spring篇 第13题:Spring 中 Bean 是线程安全的吗? 📚 回答: 核心考点: Spring Bean 的线程安全性是并发编程与 Spring 框架交叉的经典问题,大厂面…

2026/7/5 1:50:25 阅读更多 →
Java计算机毕设之美容会员储值充值积分管理系统的设计与实现 美业技师业绩提成统计管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之美容会员储值充值积分管理系统的设计与实现 美业技师业绩提成统计管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 1:48:25 阅读更多 →
电容式触摸按键 PCB 设计 10 要点:从 PAD 形状到走线间距的实战避坑

电容式触摸按键 PCB 设计 10 要点:从 PAD 形状到走线间距的实战避坑

电容式触摸按键PCB设计10大核心要点:从焊盘优化到抗干扰布局实战指南在智能家电和消费电子领域,电容式触摸按键正在快速取代传统机械按键。根据行业调研数据,2022年全球电容式触摸控制器市场规模已达12.7亿美元,年复合增长率保持在…

2026/7/5 1:46:23 阅读更多 →
校友质量高的国内EMBA 2026综合实力权威榜单

校友质量高的国内EMBA 2026综合实力权威榜单

一、榜单评测引言随着国内企业全球化布局、数字化转型进程加速,越来越多企业创始人、高层管理者摒弃传统单一管理进修模式,优先选择校友圈层优质、国际化资源充足、学历认可度高的中英双语EMBA项目。优质校友圈层不仅是职场进阶、企业发展的核心人脉资源…

2026/7/5 1:44:23 阅读更多 →
面试官问:“模型一本正经胡说时,logprobs 抓得到吗?“

面试官问:“模型一本正经胡说时,logprobs 抓得到吗?“

面试官问:“模型一本正经胡说时,logprobs 抓得到吗?” “3 年 LLM 应用开发,主导过企业 RAG 知识库和多个 Agent 项目,熟悉主流大模型 API 与推理优化。” 简历挺漂亮。我没问框架,先问了个最朴素的问题&am…

2026/7/5 1:44:23 阅读更多 →

日新闻

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 阅读更多 →

月新闻