diff --git a/lib/pages/common/common_intro_controller.dart b/lib/pages/common/common_intro_controller.dart new file mode 100644 index 00000000..8db8f92a --- /dev/null +++ b/lib/pages/common/common_intro_controller.dart @@ -0,0 +1,37 @@ +import 'package:PiliPlus/models_new/fav/fav_folder/data.dart'; +import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; +import 'package:PiliPlus/models_new/video/video_tag/data.dart'; +import 'package:PiliPlus/services/account_service.dart'; +import 'package:PiliPlus/utils/feed_back.dart'; +import 'package:get/get.dart'; + +abstract class CommonIntroController extends GetxController { + // 是否点赞 + RxBool hasLike = false.obs; + // 投币数量 + final RxInt coinNum = 0.obs; + // 是否投币 + bool get hasCoin => coinNum.value != 0; + // 是否收藏 + RxBool hasFav = false.obs; + + List? videoTags; + + Set? favIds; + Rx favFolderData = FavFolderData().obs; + + AccountService accountService = Get.find(); + + Future queryVideoInFolder(); + + Future actionFavVideo(); + + void onChoose(bool checkValue, int index) { + feedBack(); + FavFolderInfo item = favFolderData.value.list![index]; + item + ..favState = checkValue ? 1 : 0 + ..mediaCount = checkValue ? item.mediaCount + 1 : item.mediaCount - 1; + favFolderData.refresh(); + } +} diff --git a/lib/pages/fav_panel/view.dart b/lib/pages/fav_panel/view.dart index 5fbb8cb5..81f55f30 100644 --- a/lib/pages/fav_panel/view.dart +++ b/lib/pages/fav_panel/view.dart @@ -1,5 +1,7 @@ -import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/data.dart'; +import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; +import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; +import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/utils/fav_util.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:flutter/material.dart'; @@ -8,11 +10,11 @@ import 'package:get/get.dart'; class FavPanel extends StatefulWidget { const FavPanel({ super.key, - this.ctr, + required this.ctr, this.scrollController, }); - final dynamic ctr; + final CommonIntroController ctr; final ScrollController? scrollController; @override @@ -20,12 +22,66 @@ class FavPanel extends StatefulWidget { } class _FavPanelState extends State { - late Future _futureBuilderFuture; + LoadingState loadingState = LoadingState.loading(); @override void initState() { super.initState(); - _futureBuilderFuture = widget.ctr.queryVideoInFolder(); + _query(); + } + + Future _query() async { + var res = await widget.ctr.queryVideoInFolder(); + if (mounted) { + if (res['status']) { + loadingState = const Success(null); + } else { + loadingState = Error(res['msg']); + } + setState(() {}); + } + } + + Widget get _buildBody { + return switch (loadingState) { + Loading() => loadingWidget, + Success() => ListView.builder( + controller: widget.scrollController, + itemCount: widget.ctr.favFolderData.value.list!.length, + itemBuilder: (context, index) { + FavFolderInfo item = widget.ctr.favFolderData.value.list![index]; + return Material( + type: MaterialType.transparency, + child: ListTile( + onTap: () => setState( + () => widget.ctr.onChoose(item.favState != 1, index)), + dense: true, + leading: FavUtil.isPublicFav(item.attr) + ? const Icon(Icons.folder_outlined) + : const Icon(Icons.lock_outline), + minLeadingWidth: 0, + title: Text(item.title), + subtitle: Text( + '${item.mediaCount}个内容 . ${FavUtil.isPublicFavText(item.attr)}', + ), + trailing: Transform.scale( + scale: 0.9, + child: Checkbox( + value: item.favState == 1, + onChanged: (bool? checkValue) => + setState(() => widget.ctr.onChoose(checkValue!, index)), + ), + ), + ), + ); + }, + ), + Error(:var errMsg) => scrollErrorWidget( + controller: widget.scrollController, + errMsg: errMsg, + onReload: _query, + ), + }; } @override @@ -45,7 +101,7 @@ class _FavPanelState extends State { TextButton.icon( onPressed: () => Get.toNamed('/createFav')?.then((data) { if (data != null) { - (widget.ctr?.favFolderData as Rx) + widget.ctr.favFolderData ..value.list?.insert(1, data) ..refresh(); } @@ -64,83 +120,7 @@ class _FavPanelState extends State { const SizedBox(width: 16), ], ), - Expanded( - child: FutureBuilder( - future: _futureBuilderFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - // TODO: refactor - if (snapshot.data is! Map) { - return HttpError( - isSliver: false, - onReload: () => setState(() { - _futureBuilderFuture = widget.ctr.queryVideoInFolder(); - }), - ); - } - Map data = snapshot.data as Map; - if (data['status']) { - return Obx( - () => ListView.builder( - controller: widget.scrollController, - itemCount: widget.ctr.favFolderData.value.list.length, - itemBuilder: (context, index) { - return Material( - type: MaterialType.transparency, - child: ListTile( - onTap: () => widget.ctr.onChoose( - widget.ctr.favFolderData.value.list[index] - .favState != - 1, - index), - dense: true, - leading: FavUtil.isPublicFav(widget - .ctr.favFolderData.value.list[index].attr) - ? const Icon(Icons.folder_outlined) - : const Icon(Icons.lock_outline), - minLeadingWidth: 0, - title: Text(widget - .ctr.favFolderData.value.list[index].title!), - subtitle: Text( - '${widget.ctr.favFolderData.value.list[index].mediaCount}个内容 . ${FavUtil.isPublicFavText(widget.ctr.favFolderData.value.list[index].attr)}', - ), - trailing: Transform.scale( - scale: 0.9, - child: Checkbox( - value: widget.ctr.favFolderData.value - .list[index].favState == - 1, - onChanged: (bool? checkValue) => - widget.ctr.onChoose(checkValue!, index), - ), - ), - ), - ); - }, - ), - ); - } else { - return CustomScrollView( - controller: widget.scrollController, - slivers: [ - HttpError( - errMsg: data['msg'], - onReload: () => setState(() { - _futureBuilderFuture = - widget.ctr.queryVideoInFolder(); - }), - ) - ], - ); - } - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - ), - ), + Expanded(child: _buildBody), Divider( height: 1, color: theme.disabledColor.withValues(alpha: 0.08), diff --git a/lib/pages/group_panel/view.dart b/lib/pages/group_panel/view.dart index 87baea1a..9cecc679 100644 --- a/lib/pages/group_panel/view.dart +++ b/lib/pages/group_panel/view.dart @@ -1,4 +1,5 @@ -import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; +import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/models/member/tags.dart'; import 'package:PiliPlus/utils/feed_back.dart'; @@ -22,32 +23,44 @@ class GroupPanel extends StatefulWidget { } class _GroupPanelState extends State { - late Future _futureBuilderFuture; - late List tagsList; + LoadingState> loadingState = + LoadingState>.loading(); bool showDefaultBtn = true; @override void initState() { super.initState(); - _futureBuilderFuture = MemberHttp.followUpTags(); - () async { - var result = await _futureBuilderFuture; - if (result['status']) { - tagsList = result['data']; - tagsList.removeWhere((item) => item.tagid == 0); - tagsList = tagsList.map((item) { - return item..checked = widget.tags?.contains(item.tagid) == true; - }).toList(); - setState(() { + _query(); + } + + void _query() { + MemberHttp.followUpTags().then((res) { + if (mounted) { + if (res['status']) { + List tagsList = (res['data'] + as List) + ..removeWhere((item) => item.tagid == 0) + ..map((item) { + return item.checked = widget.tags?.contains(item.tagid) == true; + }).toList(); showDefaultBtn = !tagsList.any((e) => e.checked == true); - }); + loadingState = Success(tagsList); + } else { + loadingState = Error(res['msg']); + } + setState(() {}); } - }(); + }); } Future onSave() async { + if (!loadingState.isSuccess) { + Get.back(); + return; + } feedBack(); // 是否有选中的 有选中的带id,没选使用默认0 + List tagsList = loadingState.data; final bool anyHasChecked = tagsList.any((MemberTagItemModel e) => e.checked == true); late List tagidList; @@ -66,6 +79,50 @@ class _GroupPanelState extends State { } } + Widget get _buildBody { + return switch (loadingState) { + Loading() => loadingWidget, + Success(:var response) => ListView.builder( + controller: widget.scrollController, + itemCount: response.length, + itemBuilder: (context, index) { + final item = response[index]; + return Material( + type: MaterialType.transparency, + child: ListTile( + onTap: () { + item.checked = !item.checked!; + showDefaultBtn = !response.any((e) => e.checked == true); + setState(() {}); + }, + dense: true, + leading: const Icon(Icons.group_outlined), + minLeadingWidth: 0, + title: Text(item.name ?? ''), + subtitle: item.tip?.isNotEmpty == true ? Text(item.tip!) : null, + trailing: Transform.scale( + scale: 0.9, + child: Checkbox( + value: item.checked, + onChanged: (bool? checkValue) { + item.checked = checkValue; + showDefaultBtn = !response.any((e) => e.checked == true); + setState(() {}); + }, + ), + ), + ), + ); + }, + ), + Error(:var errMsg) => scrollErrorWidget( + controller: widget.scrollController, + errMsg: errMsg, + onReload: _query, + ), + }; + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -79,77 +136,7 @@ class _GroupPanelState extends State { icon: const Icon(Icons.close_outlined)), title: const Text('设置关注分组'), ), - Expanded( - child: FutureBuilder( - future: _futureBuilderFuture, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - // TODO: refactor - if (snapshot.data is! Map) { - return HttpError( - isSliver: false, - onReload: () => setState(() { - _futureBuilderFuture = MemberHttp.followUpTags(); - }), - ); - } - Map data = snapshot.data as Map; - if (data['status']) { - return ListView.builder( - controller: widget.scrollController, - itemCount: tagsList.length, - itemBuilder: (context, index) { - return Material( - type: MaterialType.transparency, - child: ListTile( - onTap: () { - tagsList[index].checked = !tagsList[index].checked!; - showDefaultBtn = - !tagsList.any((e) => e.checked == true); - setState(() {}); - }, - dense: true, - leading: const Icon(Icons.group_outlined), - minLeadingWidth: 0, - title: Text(tagsList[index].name ?? ''), - subtitle: tagsList[index].tip != '' - ? Text(tagsList[index].tip ?? '') - : null, - trailing: Transform.scale( - scale: 0.9, - child: Checkbox( - value: tagsList[index].checked, - onChanged: (bool? checkValue) { - tagsList[index].checked = checkValue; - showDefaultBtn = - !tagsList.any((e) => e.checked == true); - setState(() {}); - }, - ), - ), - ), - ); - }, - ); - } else { - return CustomScrollView( - controller: widget.scrollController, - slivers: [ - HttpError( - errMsg: data['msg'], - onReload: () => setState(() {}), - ), - ], - ); - } - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - ), - ), + Expanded(child: _buildBody), Divider( height: 1, color: theme.disabledColor.withValues(alpha: 0.08), diff --git a/lib/pages/msg_feed_top/like_me/view.dart b/lib/pages/msg_feed_top/like_me/view.dart index 8491562d..bbdd5467 100644 --- a/lib/pages/msg_feed_top/like_me/view.dart +++ b/lib/pages/msg_feed_top/like_me/view.dart @@ -78,64 +78,66 @@ class _LikeMePageState extends State { return const MsgFeedTopSkeleton(); }, ), - Success(:var response) => () { - Pair, List> pair = response; - List latest = pair.first; - List total = pair.second; - if (latest.isNotEmpty || total.isNotEmpty) { - return SliverMainAxisGroup( - slivers: [ - if (latest.isNotEmpty) ...[ - _buildHeader(theme, '最新'), - SliverList.separated( - itemBuilder: (context, index) { - if (total.isEmpty && index == latest.length - 1) { - _likeMeController.onLoadMore(); - } - return _buildItem( - theme, - latest[index], - (id) { - _likeMeController.onRemove(id, index, true); - }, - (isNotice, id) { - _likeMeController.onSetNotice( - id, index, isNotice, true); - }, - ); - }, - itemCount: latest.length, - separatorBuilder: (context, index) => divider, - ), + Success(:var response) => Builder( + builder: (context) { + Pair, List> pair = response; + List latest = pair.first; + List total = pair.second; + if (latest.isNotEmpty || total.isNotEmpty) { + return SliverMainAxisGroup( + slivers: [ + if (latest.isNotEmpty) ...[ + _buildHeader(theme, '最新'), + SliverList.separated( + itemBuilder: (context, index) { + if (total.isEmpty && index == latest.length - 1) { + _likeMeController.onLoadMore(); + } + return _buildItem( + theme, + latest[index], + (id) { + _likeMeController.onRemove(id, index, true); + }, + (isNotice, id) { + _likeMeController.onSetNotice( + id, index, isNotice, true); + }, + ); + }, + itemCount: latest.length, + separatorBuilder: (context, index) => divider, + ), + ], + if (total.isNotEmpty) ...[ + _buildHeader(theme, '累计'), + SliverList.separated( + itemBuilder: (context, index) { + if (index == total.length - 1) { + _likeMeController.onLoadMore(); + } + return _buildItem( + theme, + total[index], + (id) { + _likeMeController.onRemove(id, index, false); + }, + (isNotice, id) { + _likeMeController.onSetNotice( + id, index, isNotice, false); + }, + ); + }, + itemCount: total.length, + separatorBuilder: (context, index) => divider, + ), + ], ], - if (total.isNotEmpty) ...[ - _buildHeader(theme, '累计'), - SliverList.separated( - itemBuilder: (context, index) { - if (index == total.length - 1) { - _likeMeController.onLoadMore(); - } - return _buildItem( - theme, - total[index], - (id) { - _likeMeController.onRemove(id, index, false); - }, - (isNotice, id) { - _likeMeController.onSetNotice( - id, index, isNotice, false); - }, - ); - }, - itemCount: total.length, - separatorBuilder: (context, index) => divider, - ), - ], - ], - ); - } - return HttpError(onReload: _likeMeController.onReload); - }(), + ); + } + return HttpError(onReload: _likeMeController.onReload); + }, + ), Error(:var errMsg) => HttpError( errMsg: errMsg, onReload: _likeMeController.onReload, diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index db3a8951..9f812e94 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -8,19 +8,16 @@ import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/pgc_lcf.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/data.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/triple/pgc_triple.dart'; -import 'package:PiliPlus/models_new/video/video_tag/data.dart'; +import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/pay_coins/view.dart'; import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; -import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/page_utils.dart'; @@ -30,7 +27,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -class PgcIntroController extends GetxController { +class PgcIntroController extends CommonIntroController { // 视频bvid String bvid = Get.parameters['bvid'] ?? ''; var seasonId = Get.parameters['seasonId'] != null @@ -47,22 +44,6 @@ class PgcIntroController extends GetxController { final PgcInfoModel pgcItem = Get.arguments['pgcItem']; - // 是否点赞 - RxBool hasLike = false.obs; - // 投币数量 - final RxInt _coinNum = 0.obs; - // 是否投币 - bool get hasCoin => _coinNum.value != 0; - // 是否收藏 - RxBool hasFav = false.obs; - - List? videoTags; - - List? favIds; - Rx favFolderData = FavFolderData().obs; - - AccountService accountService = Get.find(); - late final enableQuickFav = GStorage.setting.get(SettingBoxKey.enableQuickFav, defaultValue: false); @@ -93,7 +74,7 @@ class PgcIntroController extends GetxController { if (result['status']) { PgcLCF data = result['data']; hasLike.value = data.like == 1; - _coinNum.value = data.coinNumber!; + coinNum.value = data.coinNumber!; hasFav.value = data.favorite == 1; } else { SmartDialog.showToast(result['msg']); @@ -125,7 +106,7 @@ class PgcIntroController extends GetxController { hasLike.value = true; pgcItem.stat!.likes = pgcItem.stat!.likes! + 1; } - _coinNum.value += coin; + coinNum.value += coin; GlobalData().afterCoin(coin); } else { SmartDialog.showToast(res['msg']); @@ -139,7 +120,7 @@ class PgcIntroController extends GetxController { return; } - if (_coinNum.value >= 2) { + if (coinNum.value >= 2) { SmartDialog.showToast('达到投币上限啦~'); return; } @@ -151,11 +132,12 @@ class PgcIntroController extends GetxController { PayCoinsPage.toPayCoinsPage( onPayCoin: coinVideo, - hasCoin: _coinNum.value == 1, + hasCoin: coinNum.value == 1, ); } // (取消)收藏 pgc + @override Future actionFavVideo({String type = 'choose'}) async { // 收藏至默认文件夹 if (type == 'default') { @@ -349,16 +331,6 @@ class PgcIntroController extends GetxController { }); } - // 选择文件夹 - void onChoose(bool checkValue, int index) { - feedBack(); - FavFolderInfo item = favFolderData.value.list![index]; - item - ..favState = checkValue ? 1 : 0 - ..mediaCount = checkValue ? item.mediaCount + 1 : item.mediaCount - 1; - favFolderData.refresh(); - } - // 修改分P或番剧分集 void changeSeasonOrbangu(dynamic epId, bvid, cid, aid, cover) { // 重新获取视频资源 @@ -431,6 +403,7 @@ class PgcIntroController extends GetxController { SmartDialog.showToast(result['msg']); } + @override Future queryVideoInFolder() async { favIds = null; var result = await FavHttp.videoInFolder( @@ -443,7 +416,7 @@ class PgcIntroController extends GetxController { favIds = favFolderData.value.list ?.where((item) => item.favState == 1) .map((item) => item.id) - .toList(); + .toSet(); } return result; } @@ -522,7 +495,7 @@ class PgcIntroController extends GetxController { PgcTriple data = result['data']; hasLike.value = data.like == 1; if (data.coin == 1) { - _coinNum.value = 2; + coinNum.value = 2; GlobalData().afterCoin(2); } hasFav.value = data.favorite == 1; diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 8e935e3a..3c111a83 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -9,8 +9,6 @@ import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/data.dart'; -import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/models_new/triple/ugc_triple.dart'; import 'package:PiliPlus/models_new/video/video_ai_conclusion/data.dart'; import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; @@ -21,14 +19,13 @@ import 'package:PiliPlus/models_new/video/video_detail/section.dart'; import 'package:PiliPlus/models_new/video/video_detail/staff.dart'; import 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart'; import 'package:PiliPlus/models_new/video/video_relation/data.dart'; -import 'package:PiliPlus/models_new/video/video_tag/data.dart'; +import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/pay_coins/view.dart'; import 'package:PiliPlus/pages/video/related/controller.dart'; import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; -import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/feed_back.dart'; @@ -44,42 +41,26 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -class VideoIntroController extends GetxController { +class VideoIntroController extends CommonIntroController { // 视频bvid late String bvid; - // 是否预渲染 骨架屏 - bool preRender = false; - // 视频详情 上个页面传入 Map videoItem = {}; late final RxMap staffRelations = {}.obs; - // 请求状态 - RxBool isLoading = false.obs; - // 视频详情 请求返回 Rx videoDetail = VideoDetailData().obs; // up主粉丝数 RxMap userStat = RxMap({'follower': '-'}); - List? videoTags; - - // 是否点赞 - RxBool hasLike = false.obs; // 是否点踩 RxBool hasDislike = false.obs; - // 投币数量 - final RxInt _coinNum = 0.obs; - // 是否投币 - bool get hasCoin => _coinNum.value != 0; - // 是否收藏 - RxBool hasFav = false.obs; + // 是否稍后再看 RxBool hasLater = false.obs; - Rx favFolderData = FavFolderData().obs; - Set? favIds; + // 关注状态 默认未关注 RxMap followStatus = {}.obs; @@ -102,8 +83,6 @@ class VideoIntroController extends GetxController { late final enableQuickFav = GStorage.setting.get(SettingBoxKey.enableQuickFav, defaultValue: false); - AccountService accountService = Get.find(); - @override void onInit() { super.onInit(); @@ -115,7 +94,6 @@ class VideoIntroController extends GetxController { } catch (_) {} if (Get.arguments.isNotEmpty) { if (Get.arguments.containsKey('videoItem')) { - preRender = true; var args = Get.arguments['videoItem']; var keys = Get.arguments.keys.toList(); try { @@ -243,7 +221,7 @@ class VideoIntroController extends GetxController { VideoRelation data = result['data']; hasLike.value = data.like!; hasDislike.value = data.dislike!; - _coinNum.value = data.coin!; + coinNum.value = data.coin!; hasFav.value = data.favorite!; } } @@ -265,7 +243,7 @@ class VideoIntroController extends GetxController { UgcTriple data = result['data']; hasLike.value = data.like!; if (data.coin == true) { - _coinNum.value = 2; + coinNum.value = 2; GlobalData().afterCoin(2); } hasFav.value = data.fav!; @@ -342,7 +320,7 @@ class VideoIntroController extends GetxController { ); if (res['status']) { SmartDialog.showToast('投币成功'); - _coinNum.value += coin; + coinNum.value += coin; GlobalData().afterCoin(coin); videoDetail.value.stat!.coin = videoDetail.value.stat!.coin! + coin; if (selectLike && !hasLike.value) { @@ -363,7 +341,7 @@ class VideoIntroController extends GetxController { int copyright = (queryVideoIntroData['data'] as VideoDetailData?)?.copyright ?? 1; - if ((copyright != 1 && _coinNum.value >= 1) || _coinNum.value >= 2) { + if ((copyright != 1 && coinNum.value >= 1) || coinNum.value >= 2) { SmartDialog.showToast('达到投币上限啦~'); return; } @@ -376,11 +354,12 @@ class VideoIntroController extends GetxController { PayCoinsPage.toPayCoinsPage( onPayCoin: coinVideo, copyright: copyright, - hasCoin: _coinNum.value == 1, + hasCoin: coinNum.value == 1, ); } // (取消)收藏 + @override Future actionFavVideo({String type = 'choose'}) async { // 收藏至默认文件夹 if (type == 'default') { @@ -546,6 +525,7 @@ class VideoIntroController extends GetxController { }); } + @override Future queryVideoInFolder() async { favIds = null; var result = await FavHttp.videoInFolder( @@ -562,16 +542,6 @@ class VideoIntroController extends GetxController { return result; } - // 选择文件夹 - void onChoose(bool checkValue, int index) { - feedBack(); - FavFolderInfo item = favFolderData.value.list![index]; - item - ..favState = checkValue ? 1 : 0 - ..mediaCount = checkValue ? item.mediaCount + 1 : item.mediaCount - 1; - favFolderData.refresh(); - } - // 查询关注状态 Future queryFollowStatus() async { if (videoDetail.value.owner == null) { diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index d7c9bbd8..80056a5a 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -380,43 +380,45 @@ class _VideoReplyReplyPanelState itemCount: 8, ), ), - Success(:var response) => () { - if (index == response!.length) { - _videoReplyReplyController.onLoadMore(); - return Container( - alignment: Alignment.center, - margin: - EdgeInsets.only(bottom: MediaQuery.paddingOf(context).bottom), - height: 125, - child: Text( - _videoReplyReplyController.isEnd ? '没有更多了' : '加载中...', - style: TextStyle( - fontSize: 12, - color: theme.colorScheme.outline, + Success(:var response) => Builder( + builder: (context) { + if (index == response!.length) { + _videoReplyReplyController.onLoadMore(); + return Container( + alignment: Alignment.center, + margin: EdgeInsets.only( + bottom: MediaQuery.paddingOf(context).bottom), + height: 125, + child: Text( + _videoReplyReplyController.isEnd ? '没有更多了' : '加载中...', + style: TextStyle( + fontSize: 12, + color: theme.colorScheme.outline, + ), ), - ), - ); - } else { - if (_videoReplyReplyController.index != null && - _videoReplyReplyController.index == index) { - colorAnimation ??= ColorTween( - begin: theme.colorScheme.onInverseSurface, - end: theme.colorScheme.surface, - ).animate(_videoReplyReplyController.controller!); - return AnimatedBuilder( - animation: colorAnimation!, - builder: (context, child) { - return ColoredBox( - color: colorAnimation!.value ?? - theme.colorScheme.onInverseSurface, - child: _replyItem(response[index], index), - ); - }, ); + } else { + if (_videoReplyReplyController.index != null && + _videoReplyReplyController.index == index) { + colorAnimation ??= ColorTween( + begin: theme.colorScheme.onInverseSurface, + end: theme.colorScheme.surface, + ).animate(_videoReplyReplyController.controller!); + return AnimatedBuilder( + animation: colorAnimation!, + builder: (context, child) { + return ColoredBox( + color: colorAnimation!.value ?? + theme.colorScheme.onInverseSurface, + child: _replyItem(response[index], index), + ); + }, + ); + } + return _replyItem(response[index], index); } - return _replyItem(response[index], index); - } - }(), + }, + ), Error(:var errMsg) => errorWidget( errMsg: errMsg, onReload: _videoReplyReplyController.onReload, diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 4291a3ba..e33b70fe 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/section.dart'; +import 'package:PiliPlus/pages/common/common_intro_controller.dart'; import 'package:PiliPlus/pages/contact/view.dart'; import 'package:PiliPlus/pages/fav_panel/view.dart'; import 'package:PiliPlus/pages/share/view.dart'; @@ -279,7 +280,7 @@ class PageUtils { static void showFavBottomSheet({ required BuildContext context, - required dynamic ctr, + required CommonIntroController ctr, }) { showModalBottomSheet( context: context, diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index 4b3b835a..4a250bc4 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -110,7 +110,7 @@ class RequestUtils { callback?.call(2); } } else { - if (followStatus == null) { + if (followStatus?['tag'] == null) { Map result = await UserHttp.hasFollow(mid); if (result['status']) { followStatus = result['data']; @@ -119,6 +119,7 @@ class RequestUtils { return; } } + if (context.mounted) { showDialog( context: context,