mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refactor: bangumi
This commit is contained in:
@@ -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']);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user