mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refactor: media
This commit is contained in:
@@ -43,7 +43,7 @@ class UserHttp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 收藏夹
|
// 收藏夹
|
||||||
static Future<LoadingState> userfavFolderNew({
|
static Future<LoadingState> userfavFolder({
|
||||||
required int pn,
|
required int pn,
|
||||||
required int ps,
|
required int ps,
|
||||||
required int mid,
|
required int mid,
|
||||||
@@ -64,31 +64,6 @@ class UserHttp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<dynamic> userfavFolder({
|
|
||||||
required int pn,
|
|
||||||
required int ps,
|
|
||||||
required int mid,
|
|
||||||
}) async {
|
|
||||||
var res = await Request().get(Api.userFavFolder, data: {
|
|
||||||
'pn': pn,
|
|
||||||
'ps': ps,
|
|
||||||
'up_mid': mid,
|
|
||||||
});
|
|
||||||
if (res.data['code'] == 0) {
|
|
||||||
late FavFolderData data;
|
|
||||||
if (res.data['data'] != null) {
|
|
||||||
data = FavFolderData.fromJson(res.data['data']);
|
|
||||||
return {'status': true, 'data': data};
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
'status': false,
|
|
||||||
'data': [],
|
|
||||||
'msg': res.data['message'] ?? '账号未登录'
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<LoadingState> userFavFolderDetail(
|
static Future<LoadingState> userFavFolderDetail(
|
||||||
{required int mediaId,
|
{required int mediaId,
|
||||||
required int pn,
|
required int pn,
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class FavController extends CommonController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<LoadingState> customGetData() => UserHttp.userfavFolderNew(
|
Future<LoadingState> customGetData() => UserHttp.userfavFolder(
|
||||||
pn: currentPage,
|
pn: currentPage,
|
||||||
ps: pageSize,
|
ps: pageSize,
|
||||||
mid: userInfo!.mid!,
|
mid: userInfo!.mid!,
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (currentPage is MediaPage) {
|
if (currentPage is MediaPage) {
|
||||||
_mediaController.queryFavFolder();
|
_mediaController.queryData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:PiliPalaX/http/user.dart';
|
import 'package:PiliPalaX/http/user.dart';
|
||||||
import 'package:PiliPalaX/models/user/fav_folder.dart';
|
|
||||||
import 'package:PiliPalaX/utils/storage.dart';
|
import 'package:PiliPalaX/utils/storage.dart';
|
||||||
|
|
||||||
class MediaController extends GetxController {
|
class MediaController extends CommonController {
|
||||||
Rx<FavFolderData> favFolderData = FavFolderData().obs;
|
|
||||||
Box userInfoCache = GStorage.userInfo;
|
Box userInfoCache = GStorage.userInfo;
|
||||||
RxBool userLogin = false.obs;
|
RxBool userLogin = false.obs;
|
||||||
List list = [
|
List list = [
|
||||||
@@ -45,25 +45,32 @@ class MediaController extends GetxController {
|
|||||||
];
|
];
|
||||||
dynamic userInfo;
|
dynamic userInfo;
|
||||||
int? mid;
|
int? mid;
|
||||||
final ScrollController scrollController = ScrollController();
|
RxInt count = (-1).obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
userInfo = userInfoCache.get('userInfoCache');
|
userInfo = userInfoCache.get('userInfoCache');
|
||||||
userLogin.value = userInfo != null;
|
userLogin.value = userInfo != null;
|
||||||
|
|
||||||
|
if (userLogin.value) {
|
||||||
|
queryData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<dynamic> queryFavFolder() async {
|
@override
|
||||||
if (!userLogin.value) {
|
bool customHandleResponse(Success response) {
|
||||||
return {'status': false, 'data': [], 'msg': '未登录'};
|
if (currentPage == 1) {
|
||||||
|
count.value = response.response.count;
|
||||||
}
|
}
|
||||||
var res = await await UserHttp.userfavFolder(
|
loadingState.value = response;
|
||||||
pn: 1,
|
return true;
|
||||||
ps: 5,
|
|
||||||
mid: mid ?? GStorage.userInfo.get('userInfoCache').mid,
|
|
||||||
);
|
|
||||||
favFolderData.value = res['data'];
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LoadingState> customGetData() => UserHttp.userfavFolder(
|
||||||
|
pn: 1,
|
||||||
|
ps: 5,
|
||||||
|
mid: mid ?? GStorage.userInfo.get('userInfoCache').mid,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@@ -20,7 +21,6 @@ class MediaPage extends StatefulWidget {
|
|||||||
class _MediaPageState extends State<MediaPage>
|
class _MediaPageState extends State<MediaPage>
|
||||||
with AutomaticKeepAliveClientMixin {
|
with AutomaticKeepAliveClientMixin {
|
||||||
late MediaController mediaController;
|
late MediaController mediaController;
|
||||||
late Future _futureBuilderFuture;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
@@ -29,20 +29,16 @@ class _MediaPageState extends State<MediaPage>
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
mediaController = Get.put(MediaController());
|
mediaController = Get.put(MediaController());
|
||||||
_futureBuilderFuture = mediaController.queryFavFolder();
|
|
||||||
ScrollController scrollController = mediaController.scrollController;
|
|
||||||
StreamController<bool> mainStream =
|
StreamController<bool> mainStream =
|
||||||
Get.find<MainController>().bottomBarStream;
|
Get.find<MainController>().bottomBarStream;
|
||||||
|
|
||||||
mediaController.userLogin.listen((status) {
|
mediaController.userLogin.listen((status) {
|
||||||
setState(() {
|
mediaController.onReload();
|
||||||
_futureBuilderFuture = mediaController.queryFavFolder();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
scrollController.addListener(
|
mediaController.scrollController.addListener(
|
||||||
() {
|
() {
|
||||||
final ScrollDirection direction =
|
final ScrollDirection direction =
|
||||||
scrollController.position.userScrollDirection;
|
mediaController.scrollController.position.userScrollDirection;
|
||||||
if (direction == ScrollDirection.forward) {
|
if (direction == ScrollDirection.forward) {
|
||||||
mainStream.add(true);
|
mainStream.add(true);
|
||||||
} else if (direction == ScrollDirection.reverse) {
|
} else if (direction == ScrollDirection.reverse) {
|
||||||
@@ -55,7 +51,6 @@ class _MediaPageState extends State<MediaPage>
|
|||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
mediaController.scrollController.removeListener(() {});
|
mediaController.scrollController.removeListener(() {});
|
||||||
mediaController.scrollController.dispose();
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,9 +150,9 @@ class _MediaPageState extends State<MediaPage>
|
|||||||
Theme.of(context).textTheme.titleMedium!.fontSize,
|
Theme.of(context).textTheme.titleMedium!.fontSize,
|
||||||
fontWeight: FontWeight.bold),
|
fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
if (mediaController.favFolderData.value.count != null)
|
if (mediaController.count.value != -1)
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: "${mediaController.favFolderData.value.count} ",
|
text: "${mediaController.count.value} ",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize:
|
fontSize:
|
||||||
Theme.of(context).textTheme.titleSmall!.fontSize,
|
Theme.of(context).textTheme.titleSmall!.fontSize,
|
||||||
@@ -177,11 +172,7 @@ class _MediaPageState extends State<MediaPage>
|
|||||||
),
|
),
|
||||||
trailing: IconButton(
|
trailing: IconButton(
|
||||||
tooltip: '刷新',
|
tooltip: '刷新',
|
||||||
onPressed: () {
|
onPressed: mediaController.onReload,
|
||||||
setState(() {
|
|
||||||
_futureBuilderFuture = mediaController.queryFavFolder();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
Icons.refresh,
|
Icons.refresh,
|
||||||
size: 20,
|
size: 20,
|
||||||
@@ -192,78 +183,62 @@ class _MediaPageState extends State<MediaPage>
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
height: MediaQuery.textScalerOf(context).scale(200),
|
height: MediaQuery.textScalerOf(context).scale(200),
|
||||||
child: FutureBuilder(
|
child: Obx(() => _buildBody(mediaController.loadingState.value)),
|
||||||
future: _futureBuilderFuture,
|
|
||||||
builder: (context, snapshot) {
|
|
||||||
if (snapshot.connectionState == ConnectionState.done) {
|
|
||||||
if (snapshot.data == null) {
|
|
||||||
return const SizedBox();
|
|
||||||
}
|
|
||||||
Map data = snapshot.data as Map;
|
|
||||||
if (data['status']) {
|
|
||||||
List favFolderList =
|
|
||||||
mediaController.favFolderData.value.list!;
|
|
||||||
int favFolderCount =
|
|
||||||
mediaController.favFolderData.value.count!;
|
|
||||||
bool flag = favFolderCount > favFolderList.length;
|
|
||||||
return Obx(() => ListView.builder(
|
|
||||||
itemCount:
|
|
||||||
mediaController.favFolderData.value.list!.length +
|
|
||||||
(flag ? 1 : 0),
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
if (flag && index == favFolderList.length) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
right: 14, bottom: 35),
|
|
||||||
child: Center(
|
|
||||||
child: IconButton(
|
|
||||||
tooltip: '查看更多',
|
|
||||||
style: ButtonStyle(
|
|
||||||
padding: MaterialStateProperty.all(
|
|
||||||
EdgeInsets.zero),
|
|
||||||
backgroundColor:
|
|
||||||
MaterialStateProperty.resolveWith(
|
|
||||||
(states) {
|
|
||||||
return Theme.of(context)
|
|
||||||
.colorScheme
|
|
||||||
.primaryContainer
|
|
||||||
.withOpacity(0.5);
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
onPressed: () => Get.toNamed('/fav'),
|
|
||||||
icon: Icon(
|
|
||||||
Icons.arrow_forward_ios,
|
|
||||||
size: 18,
|
|
||||||
color: Theme.of(context)
|
|
||||||
.colorScheme
|
|
||||||
.primary,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
return FavFolderItem(
|
|
||||||
item: mediaController
|
|
||||||
.favFolderData.value.list![index],
|
|
||||||
index: index);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
scrollDirection: Axis.horizontal,
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
return SizedBox(
|
|
||||||
height: 160,
|
|
||||||
child: Center(child: Text(data['msg'])),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 骨架屏
|
|
||||||
return const SizedBox();
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildBody(LoadingState loadingState) {
|
||||||
|
if (loadingState is Success) {
|
||||||
|
List favFolderList = loadingState.response.list;
|
||||||
|
int favFolderCount = loadingState.response.count;
|
||||||
|
bool flag = favFolderCount > favFolderList.length;
|
||||||
|
return ListView.builder(
|
||||||
|
itemCount: loadingState.response.list.length + (flag ? 1 : 0),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
if (flag && index == favFolderList.length) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(right: 14, bottom: 35),
|
||||||
|
child: Center(
|
||||||
|
child: IconButton(
|
||||||
|
tooltip: '查看更多',
|
||||||
|
style: ButtonStyle(
|
||||||
|
padding: WidgetStateProperty.all(EdgeInsets.zero),
|
||||||
|
backgroundColor: WidgetStateProperty.resolveWith((states) {
|
||||||
|
return Theme.of(context)
|
||||||
|
.colorScheme
|
||||||
|
.primaryContainer
|
||||||
|
.withOpacity(0.5);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
onPressed: () => Get.toNamed('/fav'),
|
||||||
|
icon: Icon(
|
||||||
|
Icons.arrow_forward_ios,
|
||||||
|
size: 18,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return FavFolderItem(
|
||||||
|
item: loadingState.response.list[index],
|
||||||
|
index: index,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (loadingState is Error) {
|
||||||
|
return SizedBox(
|
||||||
|
height: 160,
|
||||||
|
child: Center(child: Text(loadingState.errMsg)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return const SizedBox();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FavFolderItem extends StatelessWidget {
|
class FavFolderItem extends StatelessWidget {
|
||||||
|
|||||||
Reference in New Issue
Block a user