diff --git a/lib/pages/common/common_controller.dart b/lib/pages/common/common_controller.dart index 140b1c77..0f1695d6 100644 --- a/lib/pages/common/common_controller.dart +++ b/lib/pages/common/common_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/utils/extension.dart'; +import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -11,6 +12,17 @@ abstract mixin class ScrollOrRefreshMixin { void animateToTop() => scrollController.animToTop(); Future onRefresh(); + + void toTopOrRefresh() { + if (scrollController.hasClients) { + if (scrollController.position.pixels == 0) { + EasyThrottle.throttle( + 'topOrRefresh', const Duration(milliseconds: 500), onRefresh); + } else { + animateToTop(); + } + } + } } abstract class CommonController extends GetxController diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index 624649ed..758a4c45 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/pages/dynamics_tab/controller.dart'; import 'package:PiliPlus/pages/dynamics_tab/view.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; +import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -190,6 +191,25 @@ class DynamicsController extends GetxController scrollController.animToTop(); } + @override + void toTopOrRefresh() { + final ctr = controller; + if (ctr.scrollController.hasClients) { + if (ctr.scrollController.position.pixels == 0) { + if (scrollController.hasClients && + scrollController.position.pixels != 0) { + scrollController.animToTop(); + } + EasyThrottle.throttle( + 'topOrRefresh', const Duration(milliseconds: 500), onRefresh); + } else { + animateToTop(); + } + } else { + super.toTopOrRefresh(); + } + } + @override void onClose() { tabController.dispose(); diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 928a66e0..2c995f99 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -156,9 +156,9 @@ class _MainAppState extends State }); } else { if (currentPage is HomePage) { - _homeController.animateToTop(); + _homeController.toTopOrRefresh(); } else if (currentPage is DynamicsPage) { - _dynamicController.animateToTop(); + _dynamicController.toTopOrRefresh(); } } _lastSelectTime = now;