mod: bangumi: load more followlist

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-10 10:17:54 +08:00
parent 093b84ca3a
commit c9fe3c6485
4 changed files with 97 additions and 29 deletions

View File

@@ -1,5 +1,8 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/bangumi/list.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/http/bangumi.dart';
import 'package:PiliPlus/utils/storage.dart';
@@ -7,33 +10,76 @@ import 'package:PiliPlus/utils/storage.dart';
class BangumiController extends CommonController {
bool isLoadingMore = true;
RxBool isLogin = false.obs;
late int mid;
int? mid;
dynamic userInfo;
Rx<LoadingState> followState = LoadingState.loading().obs;
@override
void onInit() {
super.onInit();
userInfo = GStorage.userInfo.get('userInfoCache');
if (userInfo != null) {
mid = userInfo.mid;
}
mid = userInfo?.mid;
isLogin.value = userInfo != null;
queryData();
queryBangumiFollow();
}
// 我的订阅
Future queryBangumiFollow() async {
userInfo = userInfo ?? GStorage.userInfo.get('userInfoCache');
if (userInfo != null) {
followState.value = await BangumiHttp.bangumiFollow(mid: userInfo.mid);
if (isLogin.value) {
followController = ScrollController();
}
}
@override
Future<LoadingState> customGetData() =>
BangumiHttp.bangumiList(page: currentPage);
Future onRefresh() {
if (isLogin.value) {
followPage = 1;
followEnd = false;
}
return super.onRefresh();
}
late int followPage = 1;
late RxInt followCount = (-1).obs;
late bool followLoading = false;
late bool followEnd = false;
late Rx<LoadingState> followState = LoadingState.loading().obs;
ScrollController? followController;
// 我的订阅
Future queryBangumiFollow([bool isRefresh = true]) async {
if (isLogin.value.not || followLoading || (isRefresh.not && followEnd)) {
return;
}
followLoading = true;
dynamic res = await BangumiHttp.bangumiFollow(
mid: mid,
type: 1,
pn: followPage,
);
if (res is Success) {
BangumiListDataModel data = res.response;
followPage++;
followEnd = data.hasNext == 0 || data.list.isNullOrEmpty;
followCount.value = data.total ?? -1;
if (isRefresh.not && followState.value is Success) {
data.list?.insertAll(0, (followState.value as Success).response);
}
followState.value = LoadingState.success(data.list);
if (isRefresh) {
followController?.animToTop();
}
} else {
followState.value = res;
}
followLoading = false;
}
@override
Future<LoadingState> customGetData() => BangumiHttp.bangumiList(
page: currentPage,
);
@override
void onClose() {
followController?.dispose();
super.onClose();
}
}

View File

@@ -1,11 +1,11 @@
import 'dart:async';
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:get/get.dart';
import 'package:nil/nil.dart';
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/http_error.dart';
import 'package:PiliPlus/pages/home/index.dart';
@@ -82,14 +82,19 @@ class _BangumiPageState extends State<BangumiPage>
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'最近追番',
style: Theme.of(context).textTheme.titleMedium,
Obx(
() => Text(
'最近追番${_bangumiController.followCount.value == -1 ? '' : ' ${_bangumiController.followCount.value}'}',
style: Theme.of(context).textTheme.titleMedium,
),
),
IconButton(
tooltip: '刷新',
onPressed: () {
_bangumiController.queryBangumiFollow();
_bangumiController
..followPage = 1
..followEnd = false
..queryBangumiFollow();
},
icon: const Icon(
Icons.refresh,
@@ -177,9 +182,13 @@ class _BangumiPageState extends State<BangumiPage>
Widget _buildFollowList(Success loadingState) {
return ListView.builder(
controller: _bangumiController.followController,
scrollDirection: Axis.horizontal,
itemCount: loadingState.response.length,
itemBuilder: (context, index) {
if (index == loadingState.response.length - 1) {
_bangumiController.queryBangumiFollow(false);
}
return Container(
width: Grid.maxRowWidth / 2,
margin: EdgeInsets.only(
@@ -198,11 +207,18 @@ class _BangumiPageState extends State<BangumiPage>
Widget _buildFollowBody(LoadingState loadingState) {
return switch (loadingState) {
Loading() => nil,
Loading() => loadingWidget,
Success() => (loadingState.response as List?)?.isNotEmpty == true
? _buildFollowList(loadingState)
: const Center(child: Text('还没有追番')),
Error() => Center(child: Text(loadingState.errMsg)),
Error() => Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
alignment: Alignment.center,
child: Text(
loadingState.errMsg,
textAlign: TextAlign.center,
),
),
LoadingState() => throw UnimplementedError(),
};
}