From 6dcad674ec3adc0c2e62706d4f6eeeeb49b3e22c Mon Sep 17 00:00:00 2001
From: xuergo <46159623+xuergo@users.noreply.github.com>
Date: Thu, 23 Mar 2023 22:58:00 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=E6=92=AD=E6=94=BE=E5=88=97?=
=?UTF-8?q?=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.vscode/launch.json | 25 +++
README.md | 1 +
.../contents.xcworkspacedata | 2 +-
lib/components/play_btn.dart | 31 ++-
lib/pages/login/login_controller.dart | 3 +
lib/pages/login/login_view.dart | 2 +-
lib/pages/play/bottom_play_bar_view.dart | 15 +-
lib/pages/play/play_controller.dart | 102 ++++++----
lib/pages/play/play_list_view.dart | 179 ++++++++++++++++++
lib/pages/play/play_state.dart | 17 +-
lib/pages/play/play_view.dart | 40 ++--
lib/pages/play/widgets/play_list_btn.dart | 35 ++++
lib/pages/play_list/play_list_binding.dart | 9 -
lib/pages/play_list/play_list_controller.dart | 18 --
lib/pages/play_list/play_list_model.dart | 0
lib/pages/play_list/play_list_view.dart | 14 --
lib/pages/tabbar/tabbar_view.dart | 1 -
lib/utils/common.dart | 13 ++
lib/utils/request.dart | 2 -
lib/utils/screen_device.dart | 2 +-
pubspec.lock | 170 +++++++++--------
pubspec.yaml | 3 +
screenshots/sc1.png | Bin 100552 -> 402281 bytes
screenshots/sc7.png | Bin 0 -> 299243 bytes
24 files changed, 477 insertions(+), 207 deletions(-)
create mode 100644 .vscode/launch.json
create mode 100644 lib/pages/play/play_list_view.dart
create mode 100644 lib/pages/play/widgets/play_list_btn.dart
delete mode 100644 lib/pages/play_list/play_list_binding.dart
delete mode 100644 lib/pages/play_list/play_list_controller.dart
delete mode 100644 lib/pages/play_list/play_list_model.dart
delete mode 100644 lib/pages/play_list/play_list_view.dart
create mode 100644 screenshots/sc7.png
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..72a377b
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,25 @@
+{
+ // 使用 IntelliSense 了解相关属性。
+ // 悬停以查看现有属性的描述。
+ // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "all-universe-flutter",
+ "request": "launch",
+ "type": "dart"
+ },
+ {
+ "name": "all-universe-flutter (profile mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "profile"
+ },
+ {
+ "name": "all-universe-flutter (release mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "release"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 82989c5..4b3cfd0 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,7 @@
+
## 🌻学习参考
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
index 21a3cc1..faeb70d 100644
--- a/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -7,4 +7,4 @@
-
+
diff --git a/lib/components/play_btn.dart b/lib/components/play_btn.dart
index ec8ae4e..aaf7081 100644
--- a/lib/components/play_btn.dart
+++ b/lib/components/play_btn.dart
@@ -54,9 +54,10 @@ class PlayBtn extends StatelessWidget {
Widget _playerButtons() {
final processingState = state.processingState;
- if (data.id != state.playData!.id) {
+ if (data.id != state.playData?.id) {
return _playBtn();
- } else if (processingState == ProcessingState.loading ||
+ } else if (processingState == ProcessingState.idle ||
+ processingState == ProcessingState.loading ||
processingState == ProcessingState.buffering) {
return _loadingBtn();
} else if (state.player.playing != true) {
@@ -74,13 +75,22 @@ class PlayBtn extends StatelessWidget {
child: Container(
padding: EdgeInsets.all(4.w),
decoration: BoxDecoration(
- color: color.withOpacity(0.1),
+ color: data.id == state.playData?.id
+ ? Colors.white
+ : color.withOpacity(0.1),
borderRadius: BorderRadius.all(Radius.circular(100.r)),
+ border: Border.all(
+ color: data.id == state.playData?.id
+ ? AppColors.primaryGreyBackground
+ : color.withOpacity(0), // 设置边框颜色为红色
+ width: 4.0.w, // 设置边框宽度为 2 像素
+ style: BorderStyle.solid, // 使用实线样式
+ ),
),
child: Icon(
Icons.play_arrow_rounded,
size: size != null ? size : 28.w,
- color: color,
+ color: data.id == state.playData?.id ? Colors.black : color,
),
),
);
@@ -92,13 +102,22 @@ class PlayBtn extends StatelessWidget {
child: Container(
padding: EdgeInsets.all(4.w),
decoration: BoxDecoration(
- color: color.withOpacity(0.1),
+ color: data.id == state.playData?.id
+ ? Colors.white
+ : color.withOpacity(0.1),
borderRadius: BorderRadius.all(Radius.circular(100.r)),
+ border: Border.all(
+ color: data.id == state.playData?.id
+ ? AppColors.primaryGreyBackground
+ : color.withOpacity(0), // 设置边框颜色为红色
+ width: 4.0.w, // 设置边框宽度为 2 像素
+ style: BorderStyle.solid, // 使用实线样式
+ ),
),
child: Icon(
Icons.pause_rounded,
size: size != null ? size : 28.w,
- color: color,
+ color: data.id == state.playData?.id ? Colors.black : color,
),
),
);
diff --git a/lib/pages/login/login_controller.dart b/lib/pages/login/login_controller.dart
index d1cb23b..d6edf13 100644
--- a/lib/pages/login/login_controller.dart
+++ b/lib/pages/login/login_controller.dart
@@ -4,6 +4,7 @@ import 'dart:developer';
import 'package:all_universe_flutter/pages/login/login_state.dart';
import 'package:all_universe_flutter/router/app_pages.dart';
import 'package:all_universe_flutter/services/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
class LoginController extends GetxController {
@@ -85,8 +86,10 @@ class LoginController extends GetxController {
"phone": state.phoneController.text,
"passWord": state.codeController.text,
};
+ EasyLoading.show(status: 'loading...');
await UserAPI.login(params: data);
state.timer?.cancel();
+ EasyLoading.dismiss();
Get.toNamed(AppRoutes.Tabbar);
} catch (e) {
log('$e');
diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart
index dceed38..f784cfd 100644
--- a/lib/pages/login/login_view.dart
+++ b/lib/pages/login/login_view.dart
@@ -198,7 +198,7 @@ class LoginPage extends StatelessWidget {
borderRadius: BorderRadius.all(Radius.circular(4.r)),
),
child: Text(
- '登录',
+ '登录 😁',
style: TextStyle(
color: Colors.white,
fontSize: 18.sp,
diff --git a/lib/pages/play/bottom_play_bar_view.dart b/lib/pages/play/bottom_play_bar_view.dart
index 9a25e5a..515018c 100644
--- a/lib/pages/play/bottom_play_bar_view.dart
+++ b/lib/pages/play/bottom_play_bar_view.dart
@@ -1,11 +1,11 @@
import 'package:all_universe_flutter/common/colors/colors.dart';
import 'package:all_universe_flutter/components/play_btn.dart';
import 'package:all_universe_flutter/pages/play/play_controller.dart';
+import 'package:all_universe_flutter/pages/play/widgets/play_list_btn.dart';
import 'package:all_universe_flutter/utils/common.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
-import 'package:just_audio/just_audio.dart';
/// 底部播放栏
class BottomPlayBarPage extends GetView {
@@ -73,18 +73,7 @@ class BottomPlayBarPage extends GetView {
SizedBox(width: 10.w),
PlayBtn(data: state.playData),
SizedBox(width: 10.w),
- Container(
- padding: EdgeInsets.all(10.w),
- child: Icon(
- Icons.line_style_rounded,
- size: 20.w,
- color: AppColors.primaryColor,
- ),
- decoration: BoxDecoration(
- color: AppColors.primaryColor.withOpacity(0.1),
- borderRadius: BorderRadius.circular(100),
- ),
- ),
+ PlayListBtn()
],
),
decoration: BoxDecoration(
diff --git a/lib/pages/play/play_controller.dart b/lib/pages/play/play_controller.dart
index f4766dc..4f31909 100644
--- a/lib/pages/play/play_controller.dart
+++ b/lib/pages/play/play_controller.dart
@@ -1,7 +1,6 @@
import 'dart:developer';
import 'package:all_universe_flutter/pages/play/play_state.dart';
-import 'package:all_universe_flutter/services/home.dart';
import 'package:get/get.dart';
import 'package:just_audio/just_audio.dart';
@@ -12,49 +11,15 @@ class PlayController extends GetxController {
void onInit() async {
// await Future.delayed(Duration(seconds: 10));
- /// 获取缓存数据
-
- super.onInit();
- }
-
- @override
- void onReady() {}
-
- @override
- void onClose() {
- state.player.pause();
- state.player.dispose();
- }
-
- /// 播放
- void play(data) async {
- /// 继续播放
- if (state.playData != null && data.id == state.playData?.id) {
- state.player.play();
- return;
- }
-
- /// 切换歌曲
- await state.player.stop();
- await state.player.dispose();
-
- state.player = AudioPlayer();
- state.playData = await getDetails({'id': data.id});
- update();
- await state.player
- .setAudioSource(AudioSource.uri(Uri.parse(state.playData!.url)));
- state.player.play();
-
- /// 时间转换系数
- getTimeGini();
-
- update();
-
/// 监听播放器播放进度
state.player.positionStream.listen(
(position) {
final duration = state.player.duration;
- final remainingSeconds = (duration! - position).inSeconds;
+ if (duration == null) return;
+
+ /// 时间转换系数
+ getTimeGini();
+ final remainingSeconds = (duration - position).inSeconds;
final remainingDuration = Duration(seconds: remainingSeconds);
state.time =
'${remainingDuration.inHours.toString().padLeft(2, '0')}:${remainingDuration.inMinutes.toString().padLeft(2, '0')}:${(remainingDuration.inSeconds % 60).toString().padLeft(2, '0')}';
@@ -78,6 +43,48 @@ class PlayController extends GetxController {
update();
},
);
+
+ super.onInit();
+ }
+
+ @override
+ void onReady() {}
+
+ @override
+ void onClose() {
+ state.player.pause();
+ state.player.dispose();
+ }
+
+ /// 播放
+ void play(data) async {
+ /// 继续播放
+ if (state.playData != null && data.id == state.playData?.id) {
+ state.player.play();
+ return;
+ }
+
+ state.playData = data;
+ update();
+
+ /// 播放列表
+ int index =
+ state.playViewList.indexWhere((item) => item.id == state.playData.id);
+ if (index != -1) {
+ state.playViewList.removeAt(index);
+ await state.playList.removeAt(index);
+ }
+ state.playViewList.insert(0, state.playData);
+
+ await state.playList
+ .insert(0, AudioSource.uri(Uri.parse(state.playData.url)));
+
+ await state.player.setAudioSource(state.playList,
+ initialIndex: 0, initialPosition: Duration.zero);
+
+ await state.player.play();
+
+ update();
}
/// 拖动进度条
@@ -103,4 +110,19 @@ class PlayController extends GetxController {
final totalSeconds = duration!.inSeconds;
state.timeGini = 1 / totalSeconds;
}
+
+ /// 拖拽事件
+ void onReorder(int oldIndex, int newIndex) {
+ if (oldIndex < newIndex) {
+ newIndex -= 1;
+ }
+
+ /// 视图列表
+ final item = state.playViewList.removeAt(oldIndex);
+ state.playViewList.insert(newIndex, item);
+
+ /// 播放列表
+ state.playList.removeAt(oldIndex);
+ state.playList.insert(0, AudioSource.uri(Uri.parse(item.url)));
+ }
}
diff --git a/lib/pages/play/play_list_view.dart b/lib/pages/play/play_list_view.dart
new file mode 100644
index 0000000..df9c908
--- /dev/null
+++ b/lib/pages/play/play_list_view.dart
@@ -0,0 +1,179 @@
+import 'package:all_universe_flutter/common/colors/colors.dart';
+import 'package:all_universe_flutter/components/cahenetwork_image.dart';
+import 'package:all_universe_flutter/components/play_btn.dart';
+import 'package:all_universe_flutter/pages/play/play_controller.dart';
+import 'package:all_universe_flutter/utils/screen_device.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+
+class PlayListPage extends StatelessWidget {
+ final controller = Get.put(PlayController());
+ final playState = Get.find().state;
+ PlayListPage({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: getDeviceWidth(context),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.only(
+ topLeft: Radius.circular(16.0.r),
+ topRight: Radius.circular(16.0.r),
+ ),
+ ),
+ child: Container(
+ child: Column(
+ children: [
+ _buildLine(),
+ SizedBox(height: 30.h),
+ _buildTitle(),
+ SizedBox(height: 20.h),
+ GetBuilder(builder: (_) => _buildList())
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _buildLine() {
+ return Center(
+ child: Container(
+ width: 50.w,
+ height: 5.h,
+ margin: EdgeInsets.only(top: 10.h),
+ decoration: BoxDecoration(
+ color: AppColors.primaryGreyText,
+ borderRadius: BorderRadius.all(
+ Radius.circular(16.0.r),
+ ),
+ ),
+ ),
+ );
+ }
+
+ /// 标题
+ Widget _buildTitle() {
+ return Padding(
+ padding: EdgeInsets.symmetric(horizontal: 20.w),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ '播放列表',
+ style: TextStyle(
+ color: AppColors.primaryText,
+ fontWeight: FontWeight.bold,
+ fontSize: 20.sp,
+ ),
+ ),
+ Icon(
+ Icons.line_style_rounded,
+ color: AppColors.primaryColor,
+ size: 28.w,
+ )
+ ],
+ ),
+ );
+ }
+
+ Widget _buildList() {
+ return Expanded(
+ child: ReorderableListView.builder(
+ physics: ClampingScrollPhysics(),
+ itemBuilder: (BuildContext context, int index) {
+ return _buidldListItem(
+ playState.playViewList[index],
+ Key('$index'),
+ );
+ },
+ itemCount: playState.playViewList.length,
+ onReorder: (int oldIndex, int newIndex) {
+ controller.onReorder(oldIndex, newIndex);
+ },
+ ),
+ );
+ }
+
+ Widget _buidldListItem(data, Key key) {
+ TextStyle _textStyle = TextStyle(
+ color: AppColors.primaryGreyText,
+ fontSize: 13.sp,
+ );
+ return Container(
+ height: 60.w,
+ key: Key('$key'),
+ margin: EdgeInsets.symmetric(vertical: 10.h),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ SizedBox(width: 10.w),
+ Icon(
+ Icons.list,
+ size: 20.w,
+ color: AppColors.primaryGreyText,
+ ),
+ SizedBox(width: 10.w),
+ Container(
+ width: 60.w,
+ height: 60.w,
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(3.r),
+ child: MyCachedNetworkImage(imageurl: data.cover),
+ ),
+ decoration: BoxDecoration(
+ color: Colors.grey[300],
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ blurRadius: 10,
+ spreadRadius: 2,
+ offset: Offset(0, 2),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(width: 10.w),
+ Expanded(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Text(
+ data.title,
+ maxLines: 2,
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: AppColors.primaryText,
+ fontWeight: FontWeight.bold,
+ fontSize: 16.sp,
+ ),
+ ),
+ ),
+ Row(
+ children: [
+ Text('62分钟前', style: _textStyle),
+ SizedBox(width: 5.w),
+ Text('·', style: _textStyle),
+ SizedBox(width: 5.w),
+ Text('62分钟前', style: _textStyle),
+ ],
+ ),
+ ],
+ ),
+ ),
+ SizedBox(width: 10.w),
+ PlayBtn(data: data),
+ Icon(
+ Icons.more_vert_outlined,
+ color: AppColors.primaryColor,
+ size: 20.w,
+ ),
+ SizedBox(width: 10.w),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/pages/play/play_state.dart b/lib/pages/play/play_state.dart
index 3eab8fb..b009c49 100644
--- a/lib/pages/play/play_state.dart
+++ b/lib/pages/play/play_state.dart
@@ -1,4 +1,3 @@
-import 'package:all_universe_flutter/model/podcast_detail.dart';
import 'package:all_universe_flutter/pages/play/widgets/play_progress.dart';
import 'package:just_audio/just_audio.dart';
@@ -19,6 +18,20 @@ class PlayState {
final ProgressBarController progressController = ProgressBarController();
/// 播放对象
- PodcastDetail? playData;
+ dynamic playData;
+
+ /// 播放列表显示用
+ List playViewList = [];
+
+ /// 播放列表 - 播放器用
+ ConcatenatingAudioSource playList = ConcatenatingAudioSource(
+ // 播放下个音频之前加载
+ useLazyPreparation: true,
+ // 定义切换算法
+ shuffleOrder: DefaultShuffleOrder(),
+ // 指定播放列表项目
+ children: [],
+ );
+
PlayState() {}
}
diff --git a/lib/pages/play/play_view.dart b/lib/pages/play/play_view.dart
index 613e0c4..1965f15 100644
--- a/lib/pages/play/play_view.dart
+++ b/lib/pages/play/play_view.dart
@@ -23,7 +23,7 @@ class PlayPage extends StatelessWidget {
Widget build(BuildContext context) {
return GetBuilder(
builder: (_) => Scaffold(
- body: InkWell(
+ body: GestureDetector(
child: Container(
width: getDeviceWidth(context),
height: getDeviceHeight(context),
@@ -56,7 +56,7 @@ class PlayPage extends StatelessWidget {
Spacer(),
/// 底部按钮
- _buildBottom(),
+ _buildBottom(context),
Icon(
Icons.keyboard_arrow_up_sharp,
color: AppColors.primaryGreyText,
@@ -286,7 +286,8 @@ class PlayPage extends StatelessWidget {
// 播放按钮样式
Widget _playerButton() {
final processingState = state.processingState;
- if (processingState == ProcessingState.loading ||
+ if (processingState == ProcessingState.idle ||
+ processingState == ProcessingState.loading ||
processingState == ProcessingState.buffering) {
// 2
return Container(
@@ -324,7 +325,7 @@ class PlayPage extends StatelessWidget {
}
/// 底部按钮
- Widget _buildBottom() {
+ Widget _buildBottom(context) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Row(
@@ -341,22 +342,25 @@ class PlayPage extends StatelessWidget {
color: Colors.white.withOpacity(.2),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
- child: Row(
- children: [
- Icon(
- Icons.list_rounded,
- size: 15.w,
- color: AppColors.primaryGreyText,
- ),
- SizedBox(width: 5.w),
- Text(
- '待播列表',
- style: TextStyle(
+ child: GestureDetector(
+ onTap: () => toPlayListPage(context),
+ child: Row(
+ children: [
+ Icon(
+ Icons.line_style_rounded,
+ size: 15.w,
color: AppColors.primaryGreyText,
- fontSize: 15.sp,
),
- ),
- ],
+ SizedBox(width: 5.w),
+ Text(
+ '待播列表',
+ style: TextStyle(
+ color: AppColors.primaryGreyText,
+ fontSize: 15.sp,
+ ),
+ ),
+ ],
+ ),
),
),
Container(
diff --git a/lib/pages/play/widgets/play_list_btn.dart b/lib/pages/play/widgets/play_list_btn.dart
new file mode 100644
index 0000000..0bb2491
--- /dev/null
+++ b/lib/pages/play/widgets/play_list_btn.dart
@@ -0,0 +1,35 @@
+import 'package:all_universe_flutter/common/colors/colors.dart';
+import 'package:all_universe_flutter/pages/play/play_controller.dart';
+import 'package:all_universe_flutter/utils/common.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+
+class PlayListBtn extends StatelessWidget {
+ PlayListBtn({
+ super.key,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return GetBuilder(
+ builder: (_) => GestureDetector(
+ onTap: () {
+ toPlayListPage(context);
+ },
+ child: Container(
+ padding: EdgeInsets.all(10.w),
+ child: Icon(
+ Icons.line_style_rounded,
+ size: 22.w,
+ color: AppColors.primaryColor,
+ ),
+ decoration: BoxDecoration(
+ color: AppColors.primaryColor.withOpacity(0.1),
+ borderRadius: BorderRadius.circular(100),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/play_list/play_list_binding.dart b/lib/pages/play_list/play_list_binding.dart
deleted file mode 100644
index 8660690..0000000
--- a/lib/pages/play_list/play_list_binding.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-import 'package:get/get.dart';
-import 'play_list_controller.dart';
-
-class PlayListBinding extends Bindings {
- @override
- void dependencies() {
- Get.lazyPut(() => PlayListController());
- }
-}
diff --git a/lib/pages/play_list/play_list_controller.dart b/lib/pages/play_list/play_list_controller.dart
deleted file mode 100644
index 7e0c88f..0000000
--- a/lib/pages/play_list/play_list_controller.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-import 'package:get/get.dart';
-
-class PlayListController extends GetxController {
- final count = 0.obs;
-
- @override
- void onInit() {
- super.onInit();
- }
-
- @override
- void onReady() {}
-
- @override
- void onClose() {}
-
- increment() => count.value++;
-}
diff --git a/lib/pages/play_list/play_list_model.dart b/lib/pages/play_list/play_list_model.dart
deleted file mode 100644
index e69de29..0000000
diff --git a/lib/pages/play_list/play_list_view.dart b/lib/pages/play_list/play_list_view.dart
deleted file mode 100644
index 7d34103..0000000
--- a/lib/pages/play_list/play_list_view.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:get/get.dart';
-import 'play_list_controller.dart';
-
-class PlayListPage extends GetView {
- const PlayListPage({Key? key}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: Container(),
- );
- }
-}
diff --git a/lib/pages/tabbar/tabbar_view.dart b/lib/pages/tabbar/tabbar_view.dart
index 025e30a..78cf8d6 100644
--- a/lib/pages/tabbar/tabbar_view.dart
+++ b/lib/pages/tabbar/tabbar_view.dart
@@ -6,7 +6,6 @@ import 'package:all_universe_flutter/pages/tabbar/tabbar_controller.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
-import 'package:just_audio/just_audio.dart';
class CustomFloatingActionButtonLocation extends FloatingActionButtonLocation {
FloatingActionButtonLocation location;
diff --git a/lib/utils/common.dart b/lib/utils/common.dart
index 587dad2..bd9dec0 100644
--- a/lib/utils/common.dart
+++ b/lib/utils/common.dart
@@ -1,9 +1,11 @@
// 分组数组
import 'dart:ui';
+import 'package:all_universe_flutter/pages/play/play_list_view.dart';
import 'package:all_universe_flutter/pages/play/play_view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
+import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
List> getSplitList(List list, int len) {
if (len <= 1) {
@@ -42,3 +44,14 @@ void toPlayPage() {
isScrollControlled: true,
);
}
+
+/// 跳转播放列表
+void toPlayListPage(BuildContext context) {
+ showBarModalBottomSheet(
+ expand: true,
+ context: context,
+ topControl: SizedBox(),
+ backgroundColor: Colors.white,
+ builder: (context) => PlayListPage(),
+ );
+}
diff --git a/lib/utils/request.dart b/lib/utils/request.dart
index 3693c8b..8afd841 100644
--- a/lib/utils/request.dart
+++ b/lib/utils/request.dart
@@ -50,11 +50,9 @@ class Request {
// 添加拦截器
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
- EasyLoading.show(status: 'loading...');
// 在请求被发送之前做一些预处理
return handler.next(options); //continue
}, onResponse: (response, handler) {
- EasyLoading.dismiss();
// 在返回响应数据之前做一些预处理
return handler.next(response);
}, onError: (DioError e, handler) {
diff --git a/lib/utils/screen_device.dart b/lib/utils/screen_device.dart
index 5a5f344..2425448 100644
--- a/lib/utils/screen_device.dart
+++ b/lib/utils/screen_device.dart
@@ -12,7 +12,7 @@ double getDeviceWidth(BuildContext context) {
return MediaQuery.of(context).size.width;
}
-/// 设备顶部状态栏宽度
+/// 设备顶部状态栏高度
double getDeviceTopHeight() {
return MediaQueryData.fromWindow(window).padding.top;
}
diff --git a/pubspec.lock b/pubspec.lock
index 109393f..7f16bb3 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -6,7 +6,7 @@ packages:
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.10.0"
audio_session:
@@ -14,7 +14,7 @@ packages:
description:
name: audio_session
sha256: e4acc4e9eaa32436dfc5d7aed7f0a370f2d7bb27ee27de30d6c4f220c2a05c73
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.1.13"
boolean_selector:
@@ -22,7 +22,7 @@ packages:
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.1"
cached_network_image:
@@ -30,7 +30,7 @@ packages:
description:
name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.2.3"
cached_network_image_platform_interface:
@@ -38,7 +38,7 @@ packages:
description:
name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.0"
cached_network_image_web:
@@ -46,7 +46,7 @@ packages:
description:
name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.0.2"
characters:
@@ -54,7 +54,7 @@ packages:
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.2.1"
clock:
@@ -62,7 +62,7 @@ packages:
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.1.1"
collection:
@@ -70,7 +70,7 @@ packages:
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.17.0"
cookie_jar:
@@ -78,7 +78,7 @@ packages:
description:
name: cookie_jar
sha256: d1cc6516a190ba667941f722b6365d202caff3dacb38de24268b8d6ff1ec8a1d
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.0.1"
cross_file:
@@ -86,7 +86,7 @@ packages:
description:
name: cross_file
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.3.3+4"
crypto:
@@ -94,7 +94,7 @@ packages:
description:
name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.0.2"
cupertino_icons:
@@ -102,7 +102,7 @@ packages:
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.0.5"
dio:
@@ -110,7 +110,7 @@ packages:
description:
name: dio
sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "4.0.6"
dio_cookie_manager:
@@ -118,7 +118,7 @@ packages:
description:
name: dio_cookie_manager
sha256: ed7ee3ba6cdb54599c8984d5a4ce09675c553ead6c28608eb54e38eec5b4f954
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.0"
fake_async:
@@ -126,7 +126,7 @@ packages:
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.3.1"
ffi:
@@ -134,7 +134,7 @@ packages:
description:
name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.1"
file:
@@ -142,7 +142,7 @@ packages:
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "6.1.4"
flutter:
@@ -155,7 +155,7 @@ packages:
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.7.0"
flutter_cache_manager:
@@ -163,7 +163,7 @@ packages:
description:
name: flutter_cache_manager
sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.3.0"
flutter_easyloading:
@@ -171,7 +171,7 @@ packages:
description:
name: flutter_easyloading
sha256: ba21a3c883544e582f9cc455a4a0907556714e1e9cf0eababfcb600da191d17c
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.0.5"
flutter_plugin_android_lifecycle:
@@ -179,7 +179,7 @@ packages:
description:
name: flutter_plugin_android_lifecycle
sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.9"
flutter_screenutil:
@@ -187,7 +187,7 @@ packages:
description:
name: flutter_screenutil
sha256: "0a122936b450324cbdfd51be0819cc6fcebb093eb65585e9cd92263f7a1a8a39"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "5.7.0"
flutter_spinkit:
@@ -195,7 +195,7 @@ packages:
description:
name: flutter_spinkit
sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "5.1.0"
flutter_test:
@@ -213,7 +213,7 @@ packages:
description:
name: get
sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "4.6.5"
http:
@@ -221,7 +221,7 @@ packages:
description:
name: http
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.13.5"
http_parser:
@@ -229,7 +229,7 @@ packages:
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "4.0.2"
image_gallery_saver:
@@ -237,7 +237,7 @@ packages:
description:
name: image_gallery_saver
sha256: be812580c7a320d3bf583af89cac6b376f170d48000aca75215a73285a3223a0
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.7.1"
image_picker:
@@ -245,7 +245,7 @@ packages:
description:
name: image_picker
sha256: b4f02353277b39f350093a2460b32b43eafaa3bfc4f92e8d90926698d8d78df6
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.7.5+4"
image_picker_for_web:
@@ -253,7 +253,7 @@ packages:
description:
name: image_picker_for_web
sha256: "98f50d6b9f294c8ba35e25cc0d13b04bfddd25dbc8d32fa9d566a6572f2c081c"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.12"
image_picker_platform_interface:
@@ -261,7 +261,7 @@ packages:
description:
name: image_picker_platform_interface
sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.6.3"
intl:
@@ -269,7 +269,7 @@ packages:
description:
name: intl
sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.17.0"
js:
@@ -277,7 +277,7 @@ packages:
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.6.5"
just_audio:
@@ -285,7 +285,7 @@ packages:
description:
name: just_audio
sha256: "7e6d31508dacd01a066e3889caf6282e5f1eb60707c230203b21a83af5c55586"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.9.32"
just_audio_platform_interface:
@@ -293,7 +293,7 @@ packages:
description:
name: just_audio_platform_interface
sha256: eff112d5138bea3ba544b6338b1e0537a32b5e1425e4d0dc38f732771cda7c84
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "4.2.0"
just_audio_web:
@@ -301,7 +301,7 @@ packages:
description:
name: just_audio_web
sha256: "89d8db6f19f3821bb6bf908c4bfb846079afb2ab575b783d781a6bf119e3abaf"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.4.7"
matcher:
@@ -309,7 +309,7 @@ packages:
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.12.13"
material_color_utilities:
@@ -317,7 +317,7 @@ packages:
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.2.0"
meta:
@@ -325,15 +325,23 @@ packages:
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.8.0"
+ modal_bottom_sheet:
+ dependency: "direct main"
+ description:
+ name: modal_bottom_sheet
+ sha256: "3bba63c62d35c931bce7f8ae23a47f9a05836d8cb3c11122ada64e0b2f3d718f"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
+ source: hosted
+ version: "3.0.0-pre"
octo_image:
dependency: transitive
description:
name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.0.2"
path:
@@ -341,7 +349,7 @@ packages:
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.8.2"
path_provider:
@@ -349,7 +357,7 @@ packages:
description:
name: path_provider
sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.14"
path_provider_android:
@@ -357,7 +365,7 @@ packages:
description:
name: path_provider_android
sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.24"
path_provider_foundation:
@@ -365,7 +373,7 @@ packages:
description:
name: path_provider_foundation
sha256: "12eee51abdf4d34c590f043f45073adbb45514a108bd9db4491547a2fd891059"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.2.0"
path_provider_linux:
@@ -373,7 +381,7 @@ packages:
description:
name: path_provider_linux
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.10"
path_provider_platform_interface:
@@ -381,7 +389,7 @@ packages:
description:
name: path_provider_platform_interface
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.6"
path_provider_windows:
@@ -389,7 +397,7 @@ packages:
description:
name: path_provider_windows
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.5"
pedantic:
@@ -397,7 +405,7 @@ packages:
description:
name: pedantic
sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.11.1"
permission_handler:
@@ -405,7 +413,7 @@ packages:
description:
name: permission_handler
sha256: "4356882e9abf51aa0d56e8fb886e0d6162719f2310dd71f0b8fa7f34908b128d"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "8.3.0"
permission_handler_platform_interface:
@@ -413,7 +421,7 @@ packages:
description:
name: permission_handler_platform_interface
sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.9.0"
photo_view:
@@ -421,7 +429,7 @@ packages:
description:
name: photo_view
sha256: "871dbaa38dac9b5e7e1e1ff59027459f82a67fcbc507fef2f6146b7d6f422af6"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.11.1"
platform:
@@ -429,7 +437,7 @@ packages:
description:
name: platform
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.1.0"
plugin_platform_interface:
@@ -437,7 +445,7 @@ packages:
description:
name: plugin_platform_interface
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.4"
process:
@@ -445,7 +453,7 @@ packages:
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "4.2.4"
pull_to_refresh:
@@ -453,7 +461,7 @@ packages:
description:
name: pull_to_refresh
sha256: bbadd5a931837b57739cf08736bea63167e284e71fb23b218c8c9a6e042aad12
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.0"
rxdart:
@@ -461,7 +469,7 @@ packages:
description:
name: rxdart
sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.27.7"
shared_preferences:
@@ -469,7 +477,7 @@ packages:
description:
name: shared_preferences
sha256: "78528fd87d0d08ffd3e69551173c026e8eacc7b7079c82eb6a77413957b7e394"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.20"
shared_preferences_android:
@@ -477,7 +485,7 @@ packages:
description:
name: shared_preferences_android
sha256: ad423a80fe7b4e48b50d6111b3ea1027af0e959e49d485712e134863d9c1c521
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.17"
shared_preferences_foundation:
@@ -485,7 +493,7 @@ packages:
description:
name: shared_preferences_foundation
sha256: "1e755f8583229f185cfca61b1d80fb2344c9d660e1c69ede5450d8f478fa5310"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.5"
shared_preferences_linux:
@@ -493,7 +501,7 @@ packages:
description:
name: shared_preferences_linux
sha256: "3a59ed10890a8409ad0faad7bb2957dab4b92b8fbe553257b05d30ed8af2c707"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.5"
shared_preferences_platform_interface:
@@ -501,7 +509,7 @@ packages:
description:
name: shared_preferences_platform_interface
sha256: "824bfd02713e37603b2bdade0842e47d56e7db32b1dcdd1cae533fb88e2913fc"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.1"
shared_preferences_web:
@@ -509,7 +517,7 @@ packages:
description:
name: shared_preferences_web
sha256: "0dc2633f215a3d4aa3184c9b2c5766f4711e4e5a6b256e62aafee41f89f1bfb8"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.0.6"
shared_preferences_windows:
@@ -517,7 +525,7 @@ packages:
description:
name: shared_preferences_windows
sha256: "71bcd669bb9cdb6b39f22c4a7728b6d49e934f6cba73157ffa5a54f1eed67436"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.5"
sky_engine:
@@ -530,7 +538,7 @@ packages:
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.9.1"
sqflite:
@@ -538,7 +546,7 @@ packages:
description:
name: sqflite
sha256: "500d6fec583d2c021f2d25a056d96654f910662c64f836cd2063167b8f1fa758"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.2.6"
sqflite_common:
@@ -546,7 +554,7 @@ packages:
description:
name: sqflite_common
sha256: "963dad8c4aa2f814ce7d2d5b1da2f36f31bd1a439d8f27e3dc189bb9d26bc684"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.4.3"
stack_trace:
@@ -554,7 +562,7 @@ packages:
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.11.0"
stream_channel:
@@ -562,7 +570,7 @@ packages:
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.1"
string_scanner:
@@ -570,7 +578,7 @@ packages:
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.2.0"
synchronized:
@@ -578,7 +586,7 @@ packages:
description:
name: synchronized
sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.0.1"
term_glyph:
@@ -586,7 +594,7 @@ packages:
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.2.1"
test_api:
@@ -594,7 +602,7 @@ packages:
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "0.4.16"
typed_data:
@@ -602,7 +610,7 @@ packages:
description:
name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.3.1"
uuid:
@@ -610,7 +618,7 @@ packages:
description:
name: uuid
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.0.7"
vector_math:
@@ -618,7 +626,7 @@ packages:
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.1.4"
webview_flutter:
@@ -626,7 +634,7 @@ packages:
description:
name: webview_flutter
sha256: "6886b3ceef1541109df5001054aade5ee3c36b5780302e41701c78357233721c"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.8.0"
webview_flutter_android:
@@ -634,7 +642,7 @@ packages:
description:
name: webview_flutter_android
sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.10.4"
webview_flutter_platform_interface:
@@ -642,7 +650,7 @@ packages:
description:
name: webview_flutter_platform_interface
sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf"
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.9.5"
webview_flutter_wkwebview:
@@ -650,7 +658,7 @@ packages:
description:
name: webview_flutter_wkwebview
sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "2.9.5"
win32:
@@ -658,7 +666,7 @@ packages:
description:
name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "3.1.3"
xdg_directories:
@@ -666,7 +674,7 @@ packages:
description:
name: xdg_directories
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
- url: "https://pub.flutter-io.cn"
+ url: "http://mirrors.cnnic.cn/dart-pub/"
source: hosted
version: "1.0.0"
sdks:
diff --git a/pubspec.yaml b/pubspec.yaml
index dcca870..4cf2d6a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -65,6 +65,9 @@ dependencies:
# audio_service: ^0.18.9
just_audio: ^0.9.31
+ #底部弹框
+ modal_bottom_sheet: ^3.0.0-pre
+
dev_dependencies:
flutter_test:
sdk: flutter
diff --git a/screenshots/sc1.png b/screenshots/sc1.png
index 42993a9af7a1e10e08352891630dc6bbe04b79d9..29a1e1998e7276fa01f08d1415e3177b0cbabe37 100644
GIT binary patch
literal 402281
zcmX_{1y~!w*7u=Ui?*e>R&j^oUZ5>r+$rATu0cw1D-?&~1&X@|cMI+W2@u>vAVBhk
zd++=0Jj?F0JDEA0ot>F8|KCQasVETPQ{!V`U=V%!_~8o%#-mIO44mS}kI+|sS%wZ^
zU=T`tla*EbBrD6P=Hh7e&CU`7<6}gU4xX;Y5P6nC!Y`@kjDdlP6B&$Ous%M?#rXxc
z|M^CWnFserB%P6_(~%h_O$%$@!Z(lJ@w|mwGifPSzP((S~Wzz$@Fa=at^yhZsw=XJ;v88MUC
z+Qg>Mv3!YMaotQWW3imsFuqfZW$_bWEWI7%i@MfR3!WpWuGM9HjwNL+bC{AXDUIPQ
z(%Ueh@Tl4_JLxP~Wp0h14_CmutxUQsGpc*$#|NAQF>oTPmKL>qeqn*dQ}%UwFgdhu
z2ugV1!RIOSlh#&h<@I=YWT-C9CdsRyZU(c&1P%g4O+>!@-6P^Ms)^tQy-tG2z=g+~
zPo0f53nD>-FG8GNhO%M*VQ1ZXCsjsr=J!?FscqOg-%Tcym0UlYWxGo2PA^OInGXFy
zJG)?f`BcCkj;)eQ9(`vI8Q$I(;T%yPKB+&QX7pekjEPgbiDn<)`9O62(bD<+j^kx4
zX{0Px5<*wKkpGR!wn?%HH@AtMc|$nO-|k!dTGH-BSeO2dm>klHbKz}n>K~z;*X$o7
zXj7x4C|{Iiie4!(t3>PU`Tcr<+s`tv`Qnpt^e}@U#ZJhuw`=$+e&nW>`B{NX6Jrv>
ztFVCkopc(Lab^!eocc~M7iN4Q)(;HQLDLZoQYqr6^>F^nPBu%`$Lp9ZgO6m^i_LK5
z->~`go>G!Tc4a?(BHgv#Bqdk*^o2C?fU#6eE&_Q?Rxwv
zB}N9pcsCGt=WI3m^yh@M*T*LL-8U=LT&(fP#BJt@Cooyf`oZgJ@+N^9w*f3?lVai|
zXYrM%LYofU#5C}*_|=yq>f0QZ_!mq^9b@ZZt-0r~MSrWGKXt)ayn@E_`=;OKM7GUI
z&MBnX_L~BQgT*BWpm%BjOfiMK!-%ngD|72A(goo|?m3Lq1)j2Jwmq?fXY2buWx7UK
zlbbJYwq)ogB{zvy^t|5^WZM2|{nNpGiy!iP`^2U*jWO*NnWZHK@8W3`qlHVKU(r`3
z3Tp}-jIA|_?Slj5vdz|@-Fg6Y=MFRQq#B7t%C0q^nqwToe#Qk%dyXgLNYd?NWZG|z
z6v%xhPGNX_${`)5nvQwruZLkE#6Yo*=_iHp7I8EOqR63W!^(b!{qm*e&mc<1!f>+9
zz$QlaUXmyBui}N?kbP39dCK!jw(zCvFBc1{8uG=TGmO6R@3ydAi1(x%UXuKB*b+E@
z(x*nGi6#wCvli-ddCxr9?vu+$K14?!OmYB}oijY*
zqlB)#x|DcP{Zmy+N|9ro!&UfY)TKS?8-Vs7?q=c(3Yp=2PVbH%>o`$ng4~~zDN^b_KeQnfh^t^89jas=
z-~T=aLfyy@R{N)E`yE3dM*pMHhw|L40&tOk4v&orKc})(#;4MP*=f#c=D<>%sAv-b!6Fzc!rtkeBEX*Oy5?Yr=>OS)zGwmn-7*$C_M_oP{>Quy5a
zxuLm>GMcjN#oc8m`$+rm_Qy+K?Ct8QbAG#dPEgID*9IYPJ9`C#LIp+|w2s5vE1bx>39_=)vw%=I*y%0DZBixjD0b>C&`)TDPGXmQ95mTU-?e
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Ν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