当前位置:   article > 正文

Flutter 实现一个集各大音乐平台API于一体的音乐播放器APP(一、项目初始化)_flutter 音频播放器

flutter 音频播放器

近几年由于国内对音乐版权的重视,有些歌曲在某一个音乐app上完全搜不到,所以手机上往往要下载比如QQ音乐、网易云音乐、酷狗音乐、咪咕音乐等诸多个app,对于和我一样有手机内存洁癖的人来说,实属忍无可忍。索性了解到Flutter 使用Dart语言可以做到跨平台(IOS、Android、Window、Web等)的应用的高效实现,所以自己动手实现一个集各大音乐平台于一体的音乐播放器 --- 《FreeMusic》喜欢的小伙伴可以下载使用,附上下载地址:蓝奏云下载地址。如果你对Dart + Flutter 还不是很了解,可以自行百度学习一下。 好了废话不多说,开启我们的音乐播放器之旅。

思维导图

该图只是截止到目前,后续还会有一些功能加进去。

项目初始化

首先要搭建自己的flutter环境,这里不做教程。然后选择目录,运行flutter create 命令。

等待命令执行完毕后,会看到如下结果,代表项目已经创建成功。此时运行flutter run 命令,即可在模拟器或者你的手机上看到刚刚创建的应用程序。(本文是建立在flutter环境,Android或者ios 环境已经搭建完毕之后的,如果flutte命令出现一些问题,可以私信我,或者百度搜索)

项目创建好之后,我们用vscode打开,然后删除一些自动生产的代码,其中主要是main.dart,替换为如下代码

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(FreeMusicApp());
  3. class FreeMusicApp extends StatefulWidget {
  4. @override
  5. State<StatefulWidget> createState() {
  6. return FreeMusicState();
  7. }
  8. }
  9. class FreeMusicState extends State<FreeMusicApp> {
  10. @override
  11. Widget build(BuildContext context) {
  12. return MaterialApp(
  13. debugShowCheckedModeBanner: false,
  14. title: 'FreeMusic',
  15. home: Scaffold(
  16. body: Container(
  17. child: Text("Hello FreeMusic"),
  18. ),
  19. ),
  20. );
  21. }
  22. }

test文件夹下的文件是测试用的,对我们没有用处,也可以删除。接下来在lib文件夹下创建以下文件夹。

在与lib同级的目录下创建images,用于存放app中用到的图片。

添加插件

flutter 项目的插件是在项目根目录下的 pubspec.yaml 文件中统一管理的。在pubspec.yaml文件中的 dependencies 节点插入该app需要的依赖。保存后flutter可以自动拉取依赖。

  1. fluttertoast: ^2.1.1 #消息提示框
  2. flutter_flux: ^4.1.3 #状态管理,数据流
  3. sqflite: ^1.1.7+1 #android本地数据库
  4. shared_preferences: ^0.5.6 #本地存储数据,持久化
  5. sticky_headers: "^0.1.8" #粘性头部
  6. flutter_spinkit: "^4.1.0" #一个loading插件
  7. audioplayers: ^0.13.5 #播放音乐的
  8. package_info: ^0.4.0+13 #获取app信息的
  9. url_launcher: ^5.4.1 #打开url
  10. webview_flutter: ^0.3.18+1 #支持显示web页面
  11. crypto: ^2.0.6 #加密
  12. encrypt: ^4.0.0 #解密
  13. dio: ^3.0.3 #网络请求
  14. path_provider: ^1.4.0 #访问本机文件
  15. marquee: ^1.3.1 #轮播
  16. permission_handler: ^4.0.0 #手动获取权限
  17. flutter_audio_query: ^0.3.2 #本地多媒体文件

添加图片引用

flutter 项目的静态图片引用比较麻烦,需要先在pubspec.yaml文件中的 assets 节点中声明,然后才能在代码中通过Image.assets()的方式访问到,因此,我们需要把项目要用到的图片引用添加到pubspec.yaml文件中

  1. assets:
  2. - images/more.png
  3. - images/mobile.jpg
  4. - images/netease.png
  5. - images/nvhai.png
  6. - images/qq.png
  7. - images/favorite.png
  8. - images/shoucang.png
  9. - images/zuijin.png
  10. - images/yun.png
  11. …… 下面的省略

创建工具类

这里的工具类共有两个,Constant.dart -- APP中常用的常量,比如背景色之类的; SQFLite.dart -- app 需要创建的数据库和数据表

  1. import 'package:flutter/material.dart';
  2. class Constant {
  3. static Color themeColor = Color.fromRGBO(216, 30, 6, 0.8);
  4. static Color wordColor = Color.fromRGBO(96,96,96, 1);
  5. static Color toolBarColor = Color.fromRGBO(96,96,96, 0.5);
  6. static Color backgroundColor = Color.fromRGBO(240, 240, 240, 1);
  7. }
  1. import 'package:sqflite/sqflite.dart';
  2. import 'package:path/path.dart';
  3. class SQFLiteUtil {
  4. static SQFLiteUtil _instance;
  5. static Database _db;
  6. SQFLiteUtil._();
  7. static Future<SQFLiteUtil> get instance async {
  8. return await getInstance();
  9. }
  10. static Future<SQFLiteUtil> getInstance() async {
  11. if (_instance == null) {
  12. _instance = SQFLiteUtil._();
  13. }
  14. if (_db == null) {
  15. await _instance._initDB();
  16. }
  17. return _instance;
  18. }
  19. Future _initDB() async {
  20. String dataBasePath = await getDatabasesPath();
  21. String path = join(dataBasePath, "freemusic.db");
  22. _db = await openDatabase(path, version: 1, onCreate: _onCreate);
  23. }
  24. void _onCreate(Database db, int newVersion) async {
  25. await db.transaction((txn) async {
  26. await txn.execute('''
  27. CREATE TABLE IF NOT EXISTS `gedan` (
  28. id INTEGER PRIMARY KEY AUTOINCREMENT,
  29. gd_name TEXT,
  30. picture TEXT,
  31. description TEXT,
  32. created TEXT
  33. );
  34. ''');
  35. await txn.execute('''
  36. CREATE TABLE IF NOT EXISTS `song` (
  37. id INTEGER PRIMARY KEY AUTOINCREMENT,
  38. hash TEXT,
  39. songid INTEGER,
  40. albummid TEXT,
  41. playUrl TEXT,
  42. img TEXT,
  43. timeLength INTEGER,
  44. singerName TEXT,
  45. songName TEXT,
  46. type TEXT,
  47. platform TEXT
  48. );
  49. ''');
  50. await txn.execute('''
  51. CREATE TABLE IF NOT EXISTS `gedan_song` (
  52. id INTEGER PRIMARY KEY AUTOINCREMENT,
  53. gd_id INTEGER,
  54. song_hash TEXT
  55. );
  56. ''');
  57. });
  58. }
  59. Database open() {
  60. return _db;
  61. }
  62. }

至此,FreeMusic的初始化工作已经完成,相关代码已上传到码云上。

gitee: https://gitee.com/JTaoLee/FreeMusic/tree/fm-dev-one

写在最后

本篇文章是这一系列的第一篇文章,笔者会持续更新,请大家多多关注,如果你有疑问可以留言或私信我。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/973815
推荐阅读
相关标签
  

闽ICP备14008679号