From a6f5bd8d7ddde85d77cc454dce0d04e3e5917e84 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 1 Dec 2024 08:54:52 +0800 Subject: [PATCH] opt: action item gesture Closes #29 Signed-off-by: bggRGjQaUbCoE --- .../bangumi/introduction/controller.dart | 2 +- lib/pages/fav_detail/controller.dart | 4 +++ lib/pages/later/controller.dart | 1 + .../introduction/widgets/action_item.dart | 30 ++++++++++++++----- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index 099726ff..2fa6721d 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -300,7 +300,7 @@ class BangumiIntroController extends CommonController { delMediaIdsNew = []; SmartDialog.showToast('操作成功'); Get.back(); - Future.delayed(const Duration(milliseconds: 500), () { + Future.delayed(const Duration(milliseconds: 255), () { queryBangumiLikeCoinFav(); }); } else { diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 175f49f8..0632c22d 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -59,6 +59,8 @@ class FavDetailController extends MultiSelectController { if (result['status']) { List dataList = (loadingState.value as Success).response; dataList.removeWhere((item) => item.id == id); + item.value.mediaCount = item.value.mediaCount! - 1; + item.refresh(); loadingState.value = LoadingState.success(dataList); SmartDialog.showToast('取消收藏'); } else { @@ -103,6 +105,8 @@ class FavDetailController extends MultiSelectController { if (result['status']) { List dataList = (loadingState.value as Success).response; Set remainList = dataList.toSet().difference(list.toSet()); + item.value.mediaCount = item.value.mediaCount! - list.length; + item.refresh(); loadingState.value = LoadingState.success(remainList.toList()); SmartDialog.showToast('取消收藏'); diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index af7f23c7..5ead415a 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -152,6 +152,7 @@ class LaterController extends MultiSelectController { Set remainList = ((loadingState.value as Success).response as List) .toSet() .difference(result.toSet()); + count.value -= aids.length; loadingState.value = LoadingState.success(remainList.toList()); if (enableMultiSelect.value) { checkedCount.value = 0; diff --git a/lib/pages/video/detail/introduction/widgets/action_item.dart b/lib/pages/video/detail/introduction/widgets/action_item.dart index b1d56217..80662855 100644 --- a/lib/pages/video/detail/introduction/widgets/action_item.dart +++ b/lib/pages/video/detail/introduction/widgets/action_item.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -42,24 +43,31 @@ class ActionItemState extends State with TickerProviderStateMixin { bool get _isThumbUp => widget.semanticsLabel == '点赞'; late int _lastTime; bool _hideCircle = false; + Timer? _timer; void _startLongPress() { _lastTime = DateTime.now().millisecondsSinceEpoch; if (!widget.hasOneThree) { - controller?.forward(); - widget.callBack?.call(true); + _timer ??= Timer(const Duration(milliseconds: 100), () { + feedBack(); + controller?.forward(); + widget.callBack?.call(true); + cancelTimer(); + }); } } void _cancelLongPress([bool isCancel = false]) { int duration = DateTime.now().millisecondsSinceEpoch - _lastTime; - if (duration < 1500) { + if (duration >= 100 && duration < 1500) { controller?.reverse(); widget.callBack?.call(false); - } - if (duration <= 50 && !isCancel) { - feedBack(); - widget.onTap?.call(); + } else if (duration < 100) { + cancelTimer(); + if (!isCancel) { + feedBack(); + widget.onTap?.call(); + } } } @@ -70,7 +78,7 @@ class ActionItemState extends State with TickerProviderStateMixin { controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 1500), - reverseDuration: const Duration(milliseconds: 500), + reverseDuration: const Duration(milliseconds: 400), ); _animation = Tween(begin: 0, end: -2 * pi).animate(controller!) @@ -88,8 +96,14 @@ class ActionItemState extends State with TickerProviderStateMixin { } } + void cancelTimer() { + _timer?.cancel(); + _timer = null; + } + @override void dispose() { + cancelTimer(); _animation?.removeListener(() {}); controller?.dispose(); super.dispose();