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 '../models/bangumi/list.dart';
import 'index.dart'; import 'index.dart';
class BangumiHttp { 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}); var res = await Request().get(Api.bangumiList, data: {'page': page});
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
return { BangumiListDataModel data =
'status': true, BangumiListDataModel.fromJson(res.data['data']);
'data': BangumiListDataModel.fromJson(res.data['data']) if (!data.list.isNullOrEmpty) {
}; return LoadingState.success(data.list);
} else { } else {
return { return LoadingState.empty();
'status': false, }
'data': [], } else {
'msg': res.data['message'], 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}); var res = await Request().get(Api.bangumiFollow, data: {'vmid': mid});
if (res.data['code'] == 0) { if (res.data['code'] == 0) {
return { BangumiListDataModel data =
'status': true, BangumiListDataModel.fromJson(res.data['data']);
'data': BangumiListDataModel.fromJson(res.data['data']) if (!data.list.isNullOrEmpty) {
}; return LoadingState.success(data.list);
} else { } else {
return { return LoadingState.empty();
'status': false, }
'data': [], } else {
'msg': res.data['message'], return LoadingState.error(res.data['message']);
};
} }
} }
} }

View File

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

View File

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