refactor: media

This commit is contained in:
bggRGjQaUbCoE
2024-09-13 15:41:20 +08:00
parent 3a6ad4b198
commit b7d115c3ae
5 changed files with 83 additions and 126 deletions

View File

@@ -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_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:PiliPalaX/http/user.dart';
import 'package:PiliPalaX/models/user/fav_folder.dart';
import 'package:PiliPalaX/utils/storage.dart';
class MediaController extends GetxController {
Rx<FavFolderData> favFolderData = FavFolderData().obs;
class MediaController extends CommonController {
Box userInfoCache = GStorage.userInfo;
RxBool userLogin = false.obs;
List list = [
@@ -45,25 +45,32 @@ class MediaController extends GetxController {
];
dynamic userInfo;
int? mid;
final ScrollController scrollController = ScrollController();
RxInt count = (-1).obs;
@override
void onInit() {
super.onInit();
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
if (userLogin.value) {
queryData();
}
}
Future<dynamic> queryFavFolder() async {
if (!userLogin.value) {
return {'status': false, 'data': [], 'msg': '未登录'};
@override
bool customHandleResponse(Success response) {
if (currentPage == 1) {
count.value = response.response.count;
}
var res = await await UserHttp.userfavFolder(
pn: 1,
ps: 5,
mid: mid ?? GStorage.userInfo.get('userInfoCache').mid,
);
favFolderData.value = res['data'];
return res;
loadingState.value = response;
return true;
}
@override
Future<LoadingState> customGetData() => UserHttp.userfavFolder(
pn: 1,
ps: 5,
mid: mid ?? GStorage.userInfo.get('userInfoCache').mid,
);
}

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
@@ -20,7 +21,6 @@ class MediaPage extends StatefulWidget {
class _MediaPageState extends State<MediaPage>
with AutomaticKeepAliveClientMixin {
late MediaController mediaController;
late Future _futureBuilderFuture;
@override
bool get wantKeepAlive => true;
@@ -29,20 +29,16 @@ class _MediaPageState extends State<MediaPage>
void initState() {
super.initState();
mediaController = Get.put(MediaController());
_futureBuilderFuture = mediaController.queryFavFolder();
ScrollController scrollController = mediaController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
mediaController.userLogin.listen((status) {
setState(() {
_futureBuilderFuture = mediaController.queryFavFolder();
});
mediaController.onReload();
});
scrollController.addListener(
mediaController.scrollController.addListener(
() {
final ScrollDirection direction =
scrollController.position.userScrollDirection;
mediaController.scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) {
mainStream.add(true);
} else if (direction == ScrollDirection.reverse) {
@@ -55,7 +51,6 @@ class _MediaPageState extends State<MediaPage>
@override
void dispose() {
mediaController.scrollController.removeListener(() {});
mediaController.scrollController.dispose();
super.dispose();
}
@@ -155,9 +150,9 @@ class _MediaPageState extends State<MediaPage>
Theme.of(context).textTheme.titleMedium!.fontSize,
fontWeight: FontWeight.bold),
),
if (mediaController.favFolderData.value.count != null)
if (mediaController.count.value != -1)
TextSpan(
text: "${mediaController.favFolderData.value.count} ",
text: "${mediaController.count.value} ",
style: TextStyle(
fontSize:
Theme.of(context).textTheme.titleSmall!.fontSize,
@@ -177,11 +172,7 @@ class _MediaPageState extends State<MediaPage>
),
trailing: IconButton(
tooltip: '刷新',
onPressed: () {
setState(() {
_futureBuilderFuture = mediaController.queryFavFolder();
});
},
onPressed: mediaController.onReload,
icon: const Icon(
Icons.refresh,
size: 20,
@@ -192,78 +183,62 @@ class _MediaPageState extends State<MediaPage>
SizedBox(
width: double.infinity,
height: MediaQuery.textScalerOf(context).scale(200),
child: FutureBuilder(
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();
}
}),
child: Obx(() => _buildBody(mediaController.loadingState.value)),
),
],
);
}
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 {