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/http/loading_state.dart';
|
||||||
import 'package:PiliPlus/utils/extension.dart';
|
import 'package:PiliPlus/utils/extension.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.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();
|
final ScrollController scrollController = ScrollController();
|
||||||
|
|
||||||
int currentPage = 1;
|
int currentPage = 1;
|
||||||
@@ -57,7 +79,8 @@ abstract class CommonController extends GetxController {
|
|||||||
isLoading = false;
|
isLoading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future onRefresh() async {
|
@override
|
||||||
|
Future<void> onRefresh() async {
|
||||||
currentPage = 1;
|
currentPage = 1;
|
||||||
isEnd = false;
|
isEnd = false;
|
||||||
await queryData();
|
await queryData();
|
||||||
@@ -67,10 +90,6 @@ abstract class CommonController extends GetxController {
|
|||||||
await queryData(false);
|
await queryData(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void animateToTop() {
|
|
||||||
scrollController.animToTop();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future onReload() async {
|
Future onReload() async {
|
||||||
loadingState.value = LoadingState.loading();
|
loadingState.value = LoadingState.loading();
|
||||||
await onRefresh();
|
await onRefresh();
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:PiliPlus/http/follow.dart';
|
import 'package:PiliPlus/http/follow.dart';
|
||||||
import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
|
import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
|
||||||
import 'package:PiliPlus/pages/dynamics/tab/view.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 'package:PiliPlus/utils/storage.dart';
|
||||||
|
|
||||||
import '../../models/follow/result.dart';
|
import '../../models/follow/result.dart';
|
||||||
|
import '../common/common_controller.dart';
|
||||||
|
|
||||||
class DynamicsController extends GetxController
|
class DynamicsController extends GetxController
|
||||||
with GetTickerProviderStateMixin {
|
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||||
String? offset = '';
|
@override
|
||||||
final ScrollController scrollController = ScrollController();
|
final ScrollController scrollController = ScrollController();
|
||||||
|
String? offset = '';
|
||||||
Rx<FollowUpModel> upData = FollowUpModel().obs;
|
Rx<FollowUpModel> upData = FollowUpModel().obs;
|
||||||
// 默认获取全部动态
|
// 默认获取全部动态
|
||||||
RxInt mid = (-1).obs;
|
RxInt mid = (-1).obs;
|
||||||
@@ -36,6 +40,9 @@ class DynamicsController extends GetxController
|
|||||||
late int currentMid = -1;
|
late int currentMid = -1;
|
||||||
late bool showLiveItems = GStorage.expandDynLivePanel;
|
late bool showLiveItems = GStorage.expandDynLivePanel;
|
||||||
|
|
||||||
|
DynamicsTabController get controller => Get.find<DynamicsTabController>(
|
||||||
|
tag: tabsConfig[tabController.index]['tag']);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@@ -160,20 +167,33 @@ class DynamicsController extends GetxController
|
|||||||
tabController.index = (mid == -1 ? 0 : 4);
|
tabController.index = (mid == -1 ? 0 : 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
onRefresh() async {
|
onRefresh() async {
|
||||||
queryFollowUp();
|
queryFollowUp();
|
||||||
await Get.find<DynamicsTabController>(
|
await controller.onRefresh();
|
||||||
tag: tabsConfig[tabController.index]['tag'])
|
|
||||||
.onRefresh();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回顶部并刷新
|
// 返回顶部并刷新
|
||||||
|
@override
|
||||||
void animateToTop() async {
|
void animateToTop() async {
|
||||||
Get.find<DynamicsTabController>(tag: tabsConfig[tabController.index]['tag'])
|
controller.animateToTop();
|
||||||
.animateToTop();
|
|
||||||
scrollController.animToTop();
|
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
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
tabController.dispose();
|
tabController.dispose();
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import 'package:PiliPlus/models/common/tab_type.dart';
|
|||||||
import 'package:PiliPlus/utils/storage.dart';
|
import 'package:PiliPlus/utils/storage.dart';
|
||||||
import '../../http/index.dart';
|
import '../../http/index.dart';
|
||||||
import '../../utils/feed_back.dart';
|
import '../../utils/feed_back.dart';
|
||||||
|
import '../common/common_controller.dart';
|
||||||
import '../mine/view.dart';
|
import '../mine/view.dart';
|
||||||
|
|
||||||
class HomeController extends GetxController with GetTickerProviderStateMixin {
|
class HomeController extends GetxController
|
||||||
|
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||||
late RxList tabs = [].obs;
|
late RxList tabs = [].obs;
|
||||||
late TabController tabController;
|
late TabController tabController;
|
||||||
late List tabsCtrList;
|
late List tabsCtrList;
|
||||||
@@ -28,6 +30,19 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
late RxString defaultSearch = ''.obs;
|
late RxString defaultSearch = ''.obs;
|
||||||
late int lateCheckSearchAt = 0;
|
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
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@@ -48,32 +63,9 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
setTabConfig();
|
setTabConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRefresh() {
|
@override
|
||||||
try {
|
Future<void> onRefresh() {
|
||||||
int index = tabController.index;
|
return controller.onRefresh().catchError((e) => debugPrint(e.toString()));
|
||||||
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 (_) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTabConfig() async {
|
void setTabConfig() async {
|
||||||
|
|||||||
@@ -140,9 +140,9 @@ class _MainAppState extends State<MainApp>
|
|||||||
dynamic currentPage = _mainController.pages[value];
|
dynamic currentPage = _mainController.pages[value];
|
||||||
|
|
||||||
if (currentPage is HomePage) {
|
if (currentPage is HomePage) {
|
||||||
_homeController.animateToTop();
|
_homeController.toTopOrRefresh();
|
||||||
} else if (currentPage is DynamicsPage) {
|
} else if (currentPage is DynamicsPage) {
|
||||||
_dynamicController.animateToTop();
|
_dynamicController.toTopOrRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
int now = DateTime.now().millisecondsSinceEpoch;
|
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:PiliPlus/pages/rank/zone/index.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:PiliPlus/models/common/rank_type.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;
|
bool flag = false;
|
||||||
late RxList tabs = [].obs;
|
late RxList tabs = [].obs;
|
||||||
RxInt initialIndex = 0.obs;
|
RxInt initialIndex = 0.obs;
|
||||||
@@ -13,6 +17,12 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
// StreamController<bool>.broadcast();
|
// StreamController<bool>.broadcast();
|
||||||
late bool enableGradientBg;
|
late bool enableGradientBg;
|
||||||
|
|
||||||
|
ZoneController get controller => Get.find<ZoneController>(
|
||||||
|
tag: tabsConfig[tabController.index]['rid'].toString());
|
||||||
|
|
||||||
|
@override
|
||||||
|
ScrollController get scrollController => controller.scrollController;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@@ -22,18 +32,6 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
setTabConfig();
|
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 {
|
void setTabConfig() async {
|
||||||
tabs.value = tabsConfig;
|
tabs.value = tabsConfig;
|
||||||
initialIndex.value = 0;
|
initialIndex.value = 0;
|
||||||
@@ -51,4 +49,7 @@ class RankController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
tabController.dispose();
|
tabController.dispose();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> onRefresh() => controller.onRefresh();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user