refactor: bangumi

This commit is contained in:
bggRGjQaUbCoE
2024-09-08 14:12:16 +08:00
parent 00015d046e
commit 70882c85c6
3 changed files with 91 additions and 157 deletions

View File

@@ -1,36 +1,37 @@
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/utils/extension.dart';
import '../models/bangumi/list.dart';
import 'index.dart';
class BangumiHttp {
static Future bangumiList({int? page}) async {
static Future<LoadingState> bangumiList({int? page}) async {
var res = await Request().get(Api.bangumiList, data: {'page': page});
if (res.data['code'] == 0) {
return {
'status': true,
'data': BangumiListDataModel.fromJson(res.data['data'])
};
BangumiListDataModel data =
BangumiListDataModel.fromJson(res.data['data']);
if (!data.list.isNullOrEmpty) {
return LoadingState.success(data.list);
} else {
return {
'status': false,
'data': [],
'msg': res.data['message'],
};
return LoadingState.empty();
}
} else {
return LoadingState.error(res.data['message']);
}
}
static Future bangumiFollow({int? mid}) async {
static Future<LoadingState> bangumiFollow({int? mid}) async {
var res = await Request().get(Api.bangumiFollow, data: {'vmid': mid});
if (res.data['code'] == 0) {
return {
'status': true,
'data': BangumiListDataModel.fromJson(res.data['data'])
};
BangumiListDataModel data =
BangumiListDataModel.fromJson(res.data['data']);
if (!data.list.isNullOrEmpty) {
return LoadingState.success(data.list);
} else {
return {
'status': false,
'data': [],
'msg': res.data['message'],
};
return LoadingState.empty();
}
} else {
return LoadingState.error(res.data['message']);
}
}
}

View File

@@ -1,21 +1,18 @@
import 'package:PiliPalaX/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/pages/common/common_controller.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:PiliPalaX/http/bangumi.dart';
import 'package:PiliPalaX/models/bangumi/list.dart';
import 'package:PiliPalaX/utils/storage.dart';
class BangumiController extends GetxController {
final ScrollController scrollController = ScrollController();
RxList<BangumiListItemModel> bangumiList = <BangumiListItemModel>[].obs;
RxList<BangumiListItemModel> bangumiFollowList = <BangumiListItemModel>[].obs;
int _currentPage = 1;
class BangumiController extends CommonController {
bool isLoadingMore = true;
Box userInfoCache = GStorage.userInfo;
RxBool userLogin = false.obs;
late int mid;
var userInfo;
dynamic userInfo;
Rx<LoadingState> followState = LoadingState.loading().obs;
@override
void onInit() {
@@ -25,49 +22,20 @@ class BangumiController extends GetxController {
mid = userInfo.mid;
}
userLogin.value = userInfo != null;
}
Future queryBangumiListFeed({type = 'init'}) async {
if (type == 'init') {
_currentPage = 1;
}
var result = await BangumiHttp.bangumiList(page: _currentPage);
if (result['status']) {
if (type == 'init') {
bangumiList.value = result['data'].list;
} else {
bangumiList.addAll(result['data'].list);
}
_currentPage += 1;
} else {}
isLoadingMore = false;
return result;
}
Future onRefresh() async {
await queryBangumiListFeed();
}
// 上拉加载
Future onLoad() async {
queryBangumiListFeed(type: 'onLoad');
queryData();
queryBangumiFollow();
}
// 我的订阅
Future queryBangumiFollow() async {
userInfo = userInfo ?? userInfoCache.get('userInfoCache');
if (userInfo == null) {
return;
if (userInfo != null) {
followState.value = await BangumiHttp.bangumiFollow(mid: userInfo.mid);
}
var result = await BangumiHttp.bangumiFollow(mid: userInfo.mid);
if (result['status']) {
bangumiFollowList.value = result['data'].list;
} else {}
return result;
}
// 返回顶部并刷新
void animateToTop() {
scrollController.animToTop();
}
@override
Future<LoadingState> customGetData() =>
BangumiHttp.bangumiList(page: currentPage);
}

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
@@ -24,8 +25,6 @@ class BangumiPage extends StatefulWidget {
class _BangumiPageState extends State<BangumiPage>
with AutomaticKeepAliveClientMixin {
final BangumiController _bangumiController = Get.put(BangumiController());
late Future? _futureBuilderFuture;
late Future? _futureBuilderFutureFollow;
@override
bool get wantKeepAlive => true;
@@ -37,16 +36,13 @@ class _BangumiPageState extends State<BangumiPage>
Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().searchBarStream;
_futureBuilderFuture = _bangumiController.queryBangumiListFeed();
_futureBuilderFutureFollow = _bangumiController.queryBangumiFollow();
_bangumiController.scrollController.addListener(
() async {
if (_bangumiController.scrollController.position.pixels >=
_bangumiController.scrollController.position.maxScrollExtent -
200) {
EasyThrottle.throttle('my-throttler', const Duration(seconds: 1), () {
_bangumiController.isLoadingMore = true;
_bangumiController.onLoad();
_bangumiController.onLoadMore();
});
}
@@ -66,7 +62,6 @@ class _BangumiPageState extends State<BangumiPage>
@override
void dispose() {
_bangumiController.scrollController.removeListener(() {});
_bangumiController.scrollController.dispose();
super.dispose();
}
@@ -75,8 +70,8 @@ class _BangumiPageState extends State<BangumiPage>
super.build(context);
return RefreshIndicator(
onRefresh: () async {
await _bangumiController.queryBangumiListFeed();
return _bangumiController.queryBangumiFollow();
await _bangumiController.queryData();
await _bangumiController.queryBangumiFollow();
},
child: CustomScrollView(
controller: _bangumiController.scrollController,
@@ -101,10 +96,7 @@ class _BangumiPageState extends State<BangumiPage>
IconButton(
tooltip: '刷新',
onPressed: () {
setState(() {
_futureBuilderFutureFollow =
_bangumiController.queryBangumiFollow();
});
},
icon: const Icon(
Icons.refresh,
@@ -116,57 +108,17 @@ class _BangumiPageState extends State<BangumiPage>
),
SizedBox(
height: Grid.maxRowWidth * 1,
child: FutureBuilder(
future: _futureBuilderFutureFollow,
builder:
(BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState ==
ConnectionState.done) {
if (snapshot.data == null) {
return const SizedBox();
}
Map data = snapshot.data as Map;
List list = _bangumiController.bangumiFollowList;
if (data['status']) {
return Obx(
() => list.isNotEmpty
? ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: list.length,
itemBuilder: (context, index) {
return Container(
width: Grid.maxRowWidth / 2,
height: Grid.maxRowWidth * 1,
margin: EdgeInsets.only(
left: StyleString.safeSpace,
right: index ==
_bangumiController
.bangumiFollowList
.length -
1
? StyleString.safeSpace
: 0),
child: BangumiCardV(
bangumiItem: _bangumiController
.bangumiFollowList[index],
),
);
},
)
: const SizedBox(
child: Obx(() =>
_bangumiController.followState.value is Empty
? const SizedBox(
child: Center(
child: Text('还没有追番'),
),
),
);
} else {
return nil;
}
} else {
return nil;
}
},
),
)
: _bangumiController.followState.value is Success
? _buildFollowList(_bangumiController
.followState.value as Success)
: const SizedBox()),
),
],
),
@@ -190,29 +142,23 @@ class _BangumiPageState extends State<BangumiPage>
SliverPadding(
padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 0, StyleString.safeSpace, 0),
sliver: FutureBuilder(
future: _futureBuilderFuture,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
Map data = snapshot.data as Map;
if (data['status']) {
return Obx(() => contentGrid(
_bangumiController, _bangumiController.bangumiList));
} else {
return HttpError(
errMsg: data['msg'],
sliver: Obx(
() => _bangumiController.loadingState.value is Loading
? contentGrid([])
: _bangumiController.loadingState.value is Success
? contentGrid(
(_bangumiController.loadingState.value as Success)
.response)
: HttpError(
errMsg: _bangumiController.loadingState.value is Error
? (_bangumiController.loadingState.value as Error)
.errMsg
: '没有相关数据',
fn: () {
setState(() {
_futureBuilderFuture =
_bangumiController.queryBangumiListFeed();
});
},
);
}
} else {
return contentGrid(_bangumiController, []);
}
},
_bangumiController.loadingState.value =
LoadingState.loading();
_bangumiController.onRefresh();
}),
),
),
],
@@ -220,7 +166,28 @@ class _BangumiPageState extends State<BangumiPage>
);
}
Widget contentGrid(ctr, bangumiList) {
Widget _buildFollowList(Success loadingState) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: loadingState.response.length,
itemBuilder: (context, index) {
return Container(
width: Grid.maxRowWidth / 2,
height: Grid.maxRowWidth * 1,
margin: EdgeInsets.only(
left: StyleString.safeSpace,
right: index == loadingState.response.length - 1
? StyleString.safeSpace
: 0),
child: BangumiCardV(
bangumiItem: loadingState.response[index],
),
);
},
);
}
Widget contentGrid(List list) {
return SliverGrid(
gridDelegate: SliverGridDelegateWithExtentAndRatio(
// 行间距
@@ -234,11 +201,9 @@ class _BangumiPageState extends State<BangumiPage>
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return bangumiList!.isNotEmpty
? BangumiCardV(bangumiItem: bangumiList[index])
: nil;
return list.isNotEmpty ? BangumiCardV(bangumiItem: list[index]) : nil;
},
childCount: bangumiList!.isNotEmpty ? bangumiList!.length : 10,
childCount: list.isNotEmpty ? list.length : 10,
),
);
}