news 2026/6/6 16:08:44

Flutter for OpenHarmony音乐播放器App实战24:我喜欢的音乐实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter for OpenHarmony音乐播放器App实战24:我喜欢的音乐实现

我喜欢的音乐是用户收藏歌曲的专属歌单,用户可以在这里找到所有标记为喜欢的歌曲。本篇将详细介绍如何实现我喜欢的音乐页面,包括歌单头部设计、排序功能和歌曲操作菜单。

功能分析

我喜欢的音乐页面需要实现以下功能:渐变封面展示、歌曲数量统计、排序方式选择、歌曲列表展示、喜欢状态切换、歌曲操作菜单。这个页面是用户管理收藏歌曲的核心入口。

核心技术点

本篇涉及的核心技术包括:StatelessWidget页面构建、LinearGradient渐变背景、ListView.builder列表构建、showModalBottomSheet底部弹窗、GetX路由导航。

对应代码文件

lib/pages/favorite/favorite_page.dart

完整代码实现

import'package:flutter/material.dart';import'package: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(){finalsongs=List.generate(20,(i)=>{'title':'喜欢的歌曲${i+1}','artist':'歌手${i%5+1}','album':'专辑${i%3+1}',});returnListView.builder(itemCount:songs.length,itemBuilder:(context,index){finalsong=songs[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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 6:39:08

遗传算法的静态二维栅格路径规划附Matlab代码

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

作者头像 李华
网站建设 2026/5/29 0:48:53

计算机Net毕设实战-基于net的实验室管理信息系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/6/5 6:35:13

上海靠谱电子产品开发,实邦电子经验丰富吗?

上海靠谱电子产品开发,实邦电子经验丰富尽显实力公司简介:十六载深耕,铸就电子行业典范上海实邦电子科技有限公司自 2009 年成立以来,至今已稳健发展 16 年。在这 16 年的岁月里,实邦电子凭借着对电子科技领域的执着追…

作者头像 李华
网站建设 2026/6/5 7:23:32

金仓赋能:关系数据库替换高效落地,Oracle 平滑迁移

在国产化替代的大背景下,不少政企单位都面临着核心系统Oracle数据库的替换难题——毕竟很多老系统跑了十几年,核心业务逻辑全绑在Oracle上,一旦迁移出问题,损失不堪设想。这两年经手过不少Oracle转金仓的项目,从金融行…

作者头像 李华