mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: refresh on top (#524)
* feat: refresh on top * check ctr client Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me> --------- Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me> Co-authored-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
committed by
GitHub
parent
7a6085e923
commit
a74edd22c1
@@ -1,9 +1,31 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/utils/extension.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
abstract class CommonController extends GetxController {
|
||||
abstract mixin class ScrollOrRefreshMixin {
|
||||
ScrollController get scrollController;
|
||||
|
||||
void animateToTop() => scrollController.animToTop();
|
||||
|
||||
Future<void> onRefresh();
|
||||
|
||||
FutureOr<void> toTopOrRefresh() {
|
||||
if (scrollController.hasClients) {
|
||||
if (scrollController.position.pixels == 0) {
|
||||
return onRefresh();
|
||||
} else {
|
||||
animateToTop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class CommonController extends GetxController
|
||||
with ScrollOrRefreshMixin {
|
||||
@override
|
||||
final ScrollController scrollController = ScrollController();
|
||||
|
||||
int currentPage = 1;
|
||||
@@ -57,7 +79,8 @@ abstract class CommonController extends GetxController {
|
||||
isLoading = false;
|
||||
}
|
||||
|
||||
Future onRefresh() async {
|
||||
@override
|
||||
Future<void> onRefresh() async {
|
||||
currentPage = 1;
|
||||
isEnd = false;
|
||||
await queryData();
|
||||
@@ -67,10 +90,6 @@ abstract class CommonController extends GetxController {
|
||||
await queryData(false);
|
||||
}
|
||||
|
||||
void animateToTop() {
|
||||
scrollController.animToTop();
|
||||
}
|
||||
|
||||
Future onReload() async {
|
||||
loadingState.value = LoadingState.loading();
|
||||
await onRefresh();
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:PiliPlus/http/follow.dart';
|
||||
import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
|
||||
import 'package:PiliPlus/pages/dynamics/tab/view.dart';
|
||||
@@ -11,11 +13,13 @@ import 'package:PiliPlus/models/dynamics/up.dart';
|
||||
import 'package:PiliPlus/utils/storage.dart';
|
||||
|
||||
import '../../models/follow/result.dart';
|
||||
import '../common/common_controller.dart';
|
||||
|
||||
class DynamicsController extends GetxController
|
||||
with GetTickerProviderStateMixin {
|
||||
String? offset = '';
|
||||
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||
@override
|
||||
final ScrollController scrollController = ScrollController();
|
||||
String? offset = '';
|
||||
Rx<FollowUpModel> upData = FollowUpModel().obs;
|
||||
// 默认获取全部动态
|
||||
RxInt mid = (-1).obs;
|
||||
@@ -36,6 +40,9 @@ class DynamicsController extends GetxController
|
||||
late int currentMid = -1;
|
||||
late bool showLiveItems = GStorage.expandDynLivePanel;
|
||||
|
||||
DynamicsTabController get controller => Get.find<DynamicsTabController>(
|
||||
tag: tabsConfig[tabController.index]['tag']);
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -160,20 +167,33 @@ class DynamicsController extends GetxController
|
||||
tabController.index = (mid == -1 ? 0 : 4);
|
||||
}
|
||||
|
||||
@override
|
||||
onRefresh() async {
|
||||
queryFollowUp();
|
||||
await Get.find<DynamicsTabController>(
|
||||
tag: tabsConfig[tabController.index]['tag'])
|
||||
.onRefresh();
|
||||
await controller.onRefresh();
|
||||
}
|
||||
|
||||
// 返回顶部并刷新
|
||||
@override
|
||||
void animateToTop() async {
|
||||
Get.find<DynamicsTabController>(tag: tabsConfig[tabController.index]['tag'])
|
||||
.animateToTop();
|
||||
controller.animateToTop();
|
||||
scrollController.animToTop();
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> toTopOrRefresh() {
|
||||
if (scrollController.hasClients && controller.scrollController.hasClients) {
|
||||
if (scrollController.position.pixels == 0 &&
|
||||
controller.scrollController.position.pixels == 0) {
|
||||
return onRefresh();
|
||||
} else {
|
||||
animateToTop();
|
||||
}
|
||||
} else {
|
||||
super.toTopOrRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
tabController.dispose();
|
||||
|
||||
@@ -7,9 +7,11 @@ import 'package:PiliPlus/models/common/tab_type.dart';
|
||||
import 'package:PiliPlus/utils/storage.dart';
|
||||
import '../../http/index.dart';
|
||||
import '../../utils/feed_back.dart';
|
||||
import '../common/common_controller.dart';
|
||||
import '../mine/view.dart';
|
||||
|
||||
class HomeController extends GetxController with GetTickerProviderStateMixin {
|
||||
class HomeController extends GetxController
|
||||
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||
late RxList tabs = [].obs;
|
||||
late TabController tabController;
|
||||
late List tabsCtrList;
|
||||
@@ -28,6 +30,19 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
||||
late RxString defaultSearch = ''.obs;
|
||||
late int lateCheckSearchAt = 0;
|
||||
|
||||
ScrollOrRefreshMixin get controller {
|
||||
final index = tabController.index;
|
||||
return tabsCtrList[index]!(
|
||||
tag: switch (tabs[index]['type']) {
|
||||
TabType.bangumi => TabType.bangumi.name,
|
||||
TabType.cinema => TabType.cinema.name,
|
||||
_ => null,
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
ScrollController get scrollController => controller.scrollController;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -48,32 +63,9 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
||||
setTabConfig();
|
||||
}
|
||||
|
||||
void onRefresh() {
|
||||
try {
|
||||
int index = tabController.index;
|
||||
var ctr = tabsCtrList[index];
|
||||
ctr(
|
||||
tag: tabs[index]['type'] == TabType.bangumi
|
||||
? TabType.bangumi.name
|
||||
: tabs[index]['type'] == TabType.cinema
|
||||
? TabType.cinema.name
|
||||
: null)
|
||||
.onRefresh();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
void animateToTop() {
|
||||
try {
|
||||
int index = tabController.index;
|
||||
var ctr = tabsCtrList[index];
|
||||
ctr(
|
||||
tag: tabs[index]['type'] == TabType.bangumi
|
||||
? TabType.bangumi.name
|
||||
: tabs[index]['type'] == TabType.cinema
|
||||
? TabType.cinema.name
|
||||
: null)
|
||||
.animateToTop();
|
||||
} catch (_) {}
|
||||
@override
|
||||
Future<void> onRefresh() {
|
||||
return controller.onRefresh().catchError((e) => debugPrint(e.toString()));
|
||||
}
|
||||
|
||||
void setTabConfig() async {
|
||||
|
||||
@@ -140,9 +140,9 @@ class _MainAppState extends State<MainApp>
|
||||
dynamic currentPage = _mainController.pages[value];
|
||||
|
||||
if (currentPage is HomePage) {
|
||||
_homeController.animateToTop();
|
||||
_homeController.toTopOrRefresh();
|
||||
} else if (currentPage is DynamicsPage) {
|
||||
_dynamicController.animateToTop();
|
||||
_dynamicController.toTopOrRefresh();
|
||||
}
|
||||
|
||||
int now = DateTime.now().millisecondsSinceEpoch;
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:PiliPlus/pages/common/common_controller.dart';
|
||||
import 'package:PiliPlus/pages/rank/zone/index.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:PiliPlus/models/common/rank_type.dart';
|
||||
|
||||
class RankController extends GetxController with GetTickerProviderStateMixin {
|
||||
class RankController extends GetxController
|
||||
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||
bool flag = false;
|
||||
late RxList tabs = [].obs;
|
||||
RxInt initialIndex = 0.obs;
|
||||
@@ -13,6 +17,12 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
||||
// StreamController<bool>.broadcast();
|
||||
late bool enableGradientBg;
|
||||
|
||||
ZoneController get controller => Get.find<ZoneController>(
|
||||
tag: tabsConfig[tabController.index]['rid'].toString());
|
||||
|
||||
@override
|
||||
ScrollController get scrollController => controller.scrollController;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -22,18 +32,6 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
||||
setTabConfig();
|
||||
}
|
||||
|
||||
void onRefresh() {
|
||||
int index = tabController.index;
|
||||
Get.find<ZoneController>(tag: tabsConfig[index]['rid'].toString())
|
||||
.onRefresh();
|
||||
}
|
||||
|
||||
void animateToTop() {
|
||||
int index = tabController.index;
|
||||
Get.find<ZoneController>(tag: tabsConfig[index]['rid'].toString())
|
||||
.animateToTop();
|
||||
}
|
||||
|
||||
void setTabConfig() async {
|
||||
tabs.value = tabsConfig;
|
||||
initialIndex.value = 0;
|
||||
@@ -51,4 +49,7 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
||||
tabController.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> onRefresh() => controller.onRefresh();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user