先上脑图

首先说一下做这个项目的想法吧,之前用react仿过网易云的客户端,正好想要学习flutter就琢磨着用flutter写一个app

先看效果吧

用到的api接口是由Binaryify大佬提供的node版本

由于是闲暇时间写的所以进度会很慢。

目前实现的功能有

搜索、

登录、

每日推荐(仅登录状态下可用)、

私人fm、

歌单

首先现在用到的flutter依赖

  card_swiper: ^1.0.4  # 轮播provider: ^6.0.0 # 状态管理shared_preferences: ^2.0.7 # 缓存flutter_easyrefresh: ^2.2.1 # 刷新组件dio: ^4.0.0 #http请求flutter_svg: ^0.23.0+1 # 支持svg加载sticky_headers: ^0.2.0 # 吸顶proste_indexed_stack: ^0.2.4loading_indicator: ^3.0.2 # 加载动画animate_do: ^2.0.0 # 初始化动画flutter_screenutil: ^5.0.1+2 # 适配处理common_utils: ^2.0.2 #各种格式处理mmoo_lyric: ^1.0.0 # 歌词处理插件audio_service: ^0.18.2 # 锁屏播放器just_audio: ^0.9.18  # 音频播放audio_session: ^0.1.6+1get_it: ^7.2.0bubble_tab_indicator: ^0.1.6 # tab下划线插件substring_highlight: ^1.0.33 # 文字加重标记scrollable_positioned_list: ^0.2.3 #歌词定位列表perfect_volume_control: ^1.0.5 #音量控制flutter_easyloading: ^3.0.3 #toast/loadingbetter_player: ^0.0.81 #播放器cached_network_image: ^3.2.0 #很好用的图片加载处理flutter_staggered_grid_view: ^0.6.0 #瀑布流fijkplayer: ^0.10.1 # 另一个播放器fijkplayer_skin: ^2.2.8 #另一个播放器的皮肤

处理到现在我觉得最大的难点对于我一个刚接触flutter的新手来说应该是歌词的处理和音频、视频的处理。

说一下我项目的构造

-lib+components 组件+http api请求+model 主要是放一些封装的组件+notifiers 这个主要是和音频处理相关的 ValueNotifier+pages 页面+provider 全局的Provider+preferences 缓存(存用户cookies,已经上次听的歌曲(这个还没实现))+routers 路由+services 这个是处理audio_service 后台的东西,完全按照官网搬过来的+style 公共样式(我基本没用到)+utils 格式处理以及其他+widget 公用的widgetpage_manager.dart 音频处理主文件

先讲一下项目的初始化构建吧

provider和shared_preferences两个插件是用于在各个页面都可以轻松获取数据和修改数据

目前我主要用来处理用户信息的存取

入口文件

void main() async {await setupServiceLocator(); // 这个后续说到WidgetsFlutterBinding.ensureInitialized();SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) // 设置手机不可被翻转.then((_) {runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (context) => DefaultProvider()..init()), // 用户信息处理并初始化],child: MyApp(),));});if (Platform.isAndroid) { // 设置主题颜色SystemUiOverlayStyle style = SystemUiOverlayStyle(statusBarColor: Colors.transparent,statusBarIconBrightness: Brightness.light);SystemChrome.setSystemUIOverlayStyle(style);}
}

路由文件 我是按照买的flutter学习教程上面配置的,应该又更好的处理办法因为使用这种想要自定义路由跳转动画就很难的

// 路由配置文件import 'package:flutter/material.dart';
import 'package:netease_app/components/live/live_video_player.dart';
import 'package:netease_app/pages/advertising.dart';
import 'package:netease_app/pages/index/all_live.dart';
import 'package:netease_app/pages/live/live_screen.dart';
import 'package:netease_app/pages/login/login.dart';
import 'package:netease_app/pages/navigation_button.dart';
import 'package:netease_app/pages/playlist/playlist.dart';
import 'package:netease_app/pages/playsongs/playsongs.dart';
import 'package:netease_app/pages/recommendSingle/recommend_single.dart';
import 'package:netease_app/pages/search/search.dart';
import 'package:netease_app/pages/search/search_result.dart';
import 'package:netease_app/pages/songComment/song_comment_page.dart';
import 'package:netease_app/pages/video_page/videoPage.dart';final routes = {"/": (context) => NavigationButtonPage(),"/start": (context) => AdvertisingPage(),"/playlist": (context, {arguments}) => PlayListPage(playlistId: arguments,),"/playsongs": (context) => PlaySongsPage(),"/search": (context, {arguments}) => SearchPage(searchTip: arguments["searchTip"],searchTips: arguments["searchTips"],),"/searchresult": (context, {arguments}) => SearchResultPage(searchValue: arguments,),"/login": (context) => UserLoginPage(),"/songcomment": (context, {arguments}) => SongCommentPage(songInfo: arguments,),'/recommentsingle': (context) => RecommendSingle(),'/videoplaylist': (context, {arguments}) => VideoPlayListPage(videoId: arguments["id"],type: arguments["type"] ?? 0,),'/livepage': (context, {arguments}) => LiveAllPage(tagid: arguments["tagid"],typetitle: arguments["typetitle"],),'/liveroom': (context, {arguments}) => LiveVideoPlayerPage(url: arguments["url"],title: arguments["title"],liveType: arguments["liveType"],cover: arguments["cover"],),'/livescreen': (context) => LiveScreenTypePgae(),
};//固定写法
// ignore: top_level_function_literal_block
var onGenerateRoute = (RouteSettings settings) {// 统一处理final String? name = settings.name;final Function? pageContentBuilder = routes[name];if (pageContentBuilder != null) {// 如果此路由返回的存在与路由中if (settings.arguments != null) {// 如果此路由携带了参数,将参数arguments 传过去final Route route = MaterialPageRoute(builder: (context) =>pageContentBuilder(context, arguments: settings.arguments));return route;} else {// 反之不携带参数final Route route =MaterialPageRoute(builder: (context) => pageContentBuilder(context));return route;}} else {// 这里处理找不到路由去到404页面}
};

首页

进过研究接口提供了首页-发现这个接口可以获取全部的首页信息

但是他分了登录状态和非登录状态

非登录状态一次性返回了全部信息

登录状态分了多次 获取新的需要添加上次的cursor

其中ADD_MENU_LIST是我自己添加进去的不想用api中的接口获取觉得麻烦

     child: ListView.builder(itemBuilder: (context, index) {/// 其他还有几个模块没有上 HOMEPAGE_PODCAST24 广播电台/// HOMEPAGE_BLOCK_FUN_CLUB 云村ktv/// HOMEPAGE_BLOCK_TOPLIST 排行榜/// HOMEPAGE_BLOCK_LISTEN_LIVE look直播/// HOMEPAGE_VOICELIST_RCMD 热门博客 有声书var element = findMusicList[index];switch (element["blockCode"]) {case "HOMEPAGE_BANNER":// 轮播图........case "HOMEPAGE_BLOCK_PLAYLIST_RCMD":// 推荐歌单case "HOMEPAGE_BLOCK_STYLE_RCMD":// 个性推荐case "HOMEPAGE_BLOCK_NEW_ALBUM_NEW_SONG":// 新歌case "HOMEPAGE_MUSIC_CALENDAR":// 音乐日历case "HOMEPAGE_MUSIC_MLOG":case "HOMEPAGE_BLOCK_MGC_PLAYLIST":case "HOMEPAGE_BLOCK_OFFICIAL_PLAYLIST":case "HOMEPAGE_BLOCK_VIDEO_PLAYLIST":List videoPlaylist = element["creatives"];case "ADD_MENU_LIST":default:return SizedBox();}

这里处理用到了EasyRefresh控制页面的刷新与加载

首页的结构大概就是

Scaffold(appBar: appBar(),body: SafeArea(child: Stack(children: [EasyRefresh(),// 这个是底部悬浮的音乐控制器Align(alignment: Alignment.bottomCenter,child: ButtonPlayWight(),)]))
)

后续会继续更新讲解并附上github地址

flutter 仿网易云音乐(1)相关推荐

  1. Flutter 仿网易云音乐App

    图 首页 歌曲播放和卡片切换 如正版一样,歌曲播放进度在播放/暂停 按钮的边框显示(页面下方,由黑变红) 没登录的话,一般只能听12秒 目前只做了 模块('超带感的说唱精选')的点播功能, 其他地方可 ...

  2. flutter 仿网易云音乐(2)

    gitee项目地址     github项目地址 如果喜欢请点点star 这里今天说一下项目的播放器选择 查看了一下pub.dev 上主流的播放器插件主要有audioplayers和just_audi ...

  3. Flutter仿网易云音乐 ---基础准备

    源码地址:https://gitee.com/admin_327355/music 资源.工具准备 1.接口:网易云音乐 NodeJS 版 API 2.UI:Android apk通过压缩文件解压后获 ...

  4. flutter 仿网易云音乐(3)

    继续深入的将一下just_audio和audio_service搭配怎么在也没啥上使用 这里主要是创建了一个全局管理page_manager.dart 首先整理一下需求,我们在页面上需要展示到播放列表 ...

  5. 仿网易云音乐的滑动冲突处理效果

    系列文章 此功能属于仿网易云音乐App的一部分 仿网易云音乐App(基础版) 实现网易云音乐的渐进式卡片切换 Flutter 自定义View--仿同花顺自选股列表 Flutter自定义View--仿高 ...

  6. Flutter+FishRedux高仿网易云音乐

    flutter_netease_cloud_music 采用FishRedux框架与开源网易云音乐api开发的高仿网易云音乐APP,技术栈主要是:Flutter+FishRedux,目前主要是偏重AP ...

  7. 还不会用Flutter?仿网易云音乐项目(已开源)

    原作者:公众号boyan 前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越 ...

  8. Flutter——实现网易云音乐的渐进式卡片切换

    介绍 此功能为 仿网易云音乐App的一部分 : 仿网易云音乐App 预览图 我们可以看到页面下方切换的卡片效果 分析 首先动画以 x轴分为两部分 : 左侧文字 和 右侧图片 右侧图片以 z轴 分为 : ...

  9. WPF仿网易云音乐系列(一、左侧菜单栏:Expander+RadioButton)

    WPF仿网易云音乐系列(一.左侧菜单栏:Expander+RadioButton) 原文:WPF仿网易云音乐系列(一.左侧菜单栏:Expander+RadioButton) 1.简介 上一篇咱们说到, ...

  10. Android 仿网易云音乐App

    因为工作实在是有点忙,所以还没完成成品,就先挂到GitHub上.日后慢慢更新啦. 项目地址 GitHub地址,希望大佬们点个star GitHub仿网易云音乐App 效果展示 注:因为视频太模糊,每日 ...

最新文章

  1. java英文字符编码_Java邮件编码非英文字符
  2. 枚举算法 C语言 试题,求代码:如图大体思路是,用枚举法,一个个的试,碰到非的情况从...
  3. MySQL 存储过程初研究
  4. Android跳转intent简单教程
  5. 文章内容排版对网站优化有哪些影响?
  6. python散点图拟合曲线-python中的多元(多项式)最佳拟合曲线?
  7. java坐标移动题目case_坐标移动
  8. 操作系统 内存碎片 cache替换算法 虚拟地址逻辑地址线性地址物理地址
  9. 平台建设的根节与基础保障——互联网平台建设系列...
  10. python pip 重新安装mysql_解决Ubuntu pip 安装 mysql-python包出错的问题
  11. 算法导论7:选择算法和数据结构准备 2016.1.7
  12. MOSSE 相关滤波器详解
  13. 关于iconfont字体图标在IE上无法显示的问题
  14. c++小游戏大全(不定时更新)
  15. css学习--css基础
  16. 【考研数学】概率论 - 随机事件和概率
  17. 520程序员的浪漫表白
  18. 网络原理学习笔记--基本概念1
  19. Dubbo2.7.3入门
  20. php mpt文件,skyline制作mpt

热门文章

  1. 4.2 无线传感器网络传输层协议
  2. 元器件选型实例(如何选一款合适的 DC-DC )
  3. UTM投影带号计算以及投影具体操作
  4. IDEA中配置OpenJDK8并查看native方法源码
  5. python题库填空_Python题库
  6. 用BT搜宝快速找种子
  7. 【转】NB-IoT移远BC95使用小结
  8. NB-IoT移远BC95调试笔记 01 加网测试
  9. Mac的反编译工具一:otool (objdump工具的OSX对应工具)。
  10. 安卓手机更换字体导致手机无限重启,不想刷机,完美解决历程