From 70882c85c6fd9a57b0bbfec7bfdb6299c958bcc4 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 8 Sep 2024 14:12:16 +0800 Subject: [PATCH] refactor: bangumi --- lib/http/bangumi.dart | 41 ++++---- lib/pages/bangumi/controller.dart | 58 +++--------- lib/pages/bangumi/view.dart | 149 ++++++++++++------------------ 3 files changed, 91 insertions(+), 157 deletions(-) diff --git a/lib/http/bangumi.dart b/lib/http/bangumi.dart index 91508682..01c806fc 100644 --- a/lib/http/bangumi.dart +++ b/lib/http/bangumi.dart @@ -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 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 LoadingState.empty(); + } } else { - return { - 'status': false, - 'data': [], - 'msg': res.data['message'], - }; + return LoadingState.error(res.data['message']); } } - static Future bangumiFollow({int? mid}) async { + static Future 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 LoadingState.empty(); + } } else { - return { - 'status': false, - 'data': [], - 'msg': res.data['message'], - }; + return LoadingState.error(res.data['message']); } } } diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart index a7b6ac33..16bf7ad9 100644 --- a/lib/pages/bangumi/controller.dart +++ b/lib/pages/bangumi/controller.dart @@ -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 bangumiList = [].obs; - RxList bangumiFollowList = [].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 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 customGetData() => + BangumiHttp.bangumiList(page: currentPage); } diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index aa1d56e8..418c8619 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -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 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 Get.find().bottomBarStream; StreamController searchBarStream = Get.find().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 @override void dispose() { _bangumiController.scrollController.removeListener(() {}); - _bangumiController.scrollController.dispose(); super.dispose(); } @@ -75,8 +70,8 @@ class _BangumiPageState extends State 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 IconButton( tooltip: '刷新', onPressed: () { - setState(() { - _futureBuilderFutureFollow = - _bangumiController.queryBangumiFollow(); - }); + _bangumiController.queryBangumiFollow(); }, icon: const Icon( Icons.refresh, @@ -116,57 +108,17 @@ class _BangumiPageState extends State ), 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: Center( - child: Text('还没有追番'), - ), - ), - ); - } else { - return nil; - } - } else { - return nil; - } - }, - ), + child: Obx(() => + _bangumiController.followState.value is Empty + ? const SizedBox( + child: Center( + child: Text('还没有追番'), + ), + ) + : _bangumiController.followState.value is Success + ? _buildFollowList(_bangumiController + .followState.value as Success) + : const SizedBox()), ), ], ), @@ -190,29 +142,23 @@ class _BangumiPageState extends State 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'], - fn: () { - setState(() { - _futureBuilderFuture = - _bangumiController.queryBangumiListFeed(); - }); - }, - ); - } - } else { - return contentGrid(_bangumiController, []); - } - }, + 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: () { + _bangumiController.loadingState.value = + LoadingState.loading(); + _bangumiController.onRefresh(); + }), ), ), ], @@ -220,7 +166,28 @@ class _BangumiPageState extends State ); } - 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 ), 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, ), ); }