mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-17 07:36:14 +08:00
refa query follow up
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -5,7 +5,7 @@ import 'package:PiliPlus/http/follow.dart';
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
|
||||
import 'package:PiliPlus/models/dynamics/up.dart';
|
||||
import 'package:PiliPlus/models_new/follow/list.dart';
|
||||
import 'package:PiliPlus/models_new/follow/data.dart';
|
||||
import 'package:PiliPlus/pages/common/common_controller.dart';
|
||||
import 'package:PiliPlus/pages/dynamics_tab/controller.dart';
|
||||
import 'package:PiliPlus/services/account_service.dart';
|
||||
@@ -13,25 +13,30 @@ import 'package:PiliPlus/utils/extension.dart';
|
||||
import 'package:PiliPlus/utils/storage_pref.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';
|
||||
|
||||
class DynamicsController extends GetxController
|
||||
with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {
|
||||
@override
|
||||
final ScrollController scrollController = ScrollController();
|
||||
String? offset = '';
|
||||
Rx<FollowUpModel> upData = FollowUpModel().obs;
|
||||
// 默认获取全部动态
|
||||
RxInt mid = (-1).obs;
|
||||
late TabController tabController;
|
||||
Set<int> tempBannedList = <int>{};
|
||||
List<UpItem> hasUpdatedUps = <UpItem>[];
|
||||
int allFollowedUpsPage = 1;
|
||||
int allFollowedUpsTotal = 0;
|
||||
late final TabController tabController = TabController(
|
||||
length: DynamicsTabType.values.length,
|
||||
vsync: this,
|
||||
initialIndex: Pref.defaultDynamicType,
|
||||
);
|
||||
|
||||
late final RxInt mid = (-1).obs;
|
||||
late int currentMid = -1;
|
||||
late bool showLiveItems = Pref.expandDynLivePanel;
|
||||
|
||||
Set<int> tempBannedList = <int>{};
|
||||
|
||||
final Rx<LoadingState<FollowUpModel>> upState =
|
||||
LoadingState<FollowUpModel>.loading().obs;
|
||||
late int _upPage = 1;
|
||||
late bool _upEnd = false;
|
||||
List<UpItem>? _cacheUpList;
|
||||
late final showAllUp = Pref.dynamicsShowAllFollowedUp;
|
||||
late bool showLiveUp = Pref.expandDynLivePanel;
|
||||
|
||||
final upPanelPosition = Pref.upPanelPosition;
|
||||
|
||||
@@ -50,114 +55,98 @@ class DynamicsController extends GetxController
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
tabController = TabController(
|
||||
length: DynamicsTabType.values.length,
|
||||
vsync: this,
|
||||
initialIndex: Pref.defaultDynamicType,
|
||||
);
|
||||
|
||||
if (showAllUp) {
|
||||
scrollController.addListener(listener);
|
||||
}
|
||||
queryFollowUp();
|
||||
}
|
||||
|
||||
void listener() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
EasyThrottle.throttle(
|
||||
'following',
|
||||
const Duration(seconds: 1),
|
||||
queryFollowing2,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> queryFollowing2() async {
|
||||
if (upData.value.upList != null &&
|
||||
upData.value.upList!.length >= allFollowedUpsTotal) {
|
||||
if (isQuerying) return;
|
||||
isQuerying = true;
|
||||
if (_upEnd) {
|
||||
isQuerying = false;
|
||||
return;
|
||||
}
|
||||
var res = await FollowHttp.followings(
|
||||
|
||||
final res = await FollowHttp.followings(
|
||||
vmid: accountService.mid,
|
||||
pn: allFollowedUpsPage,
|
||||
pn: _upPage,
|
||||
orderType: 'attention',
|
||||
ps: 50,
|
||||
);
|
||||
|
||||
if (res.isSuccess) {
|
||||
upData.value.upList ??= <UpItem>[];
|
||||
upData.value.upList!.addAll(
|
||||
res.data.list!
|
||||
.where((e) => hasUpdatedUps.every((e1) => e.mid != e1.mid))
|
||||
.map(
|
||||
(FollowItemModel e) => UpItem(
|
||||
face: e.face,
|
||||
mid: e.mid,
|
||||
uname: e.uname,
|
||||
hasUpdate: false,
|
||||
),
|
||||
),
|
||||
);
|
||||
allFollowedUpsPage += 1;
|
||||
allFollowedUpsTotal = res.data.total!;
|
||||
upData.refresh();
|
||||
} else {
|
||||
res.toast();
|
||||
_upPage++;
|
||||
final list = res.data.list;
|
||||
if (list.isEmpty) {
|
||||
_upEnd = true;
|
||||
}
|
||||
upState
|
||||
..value.data.upList.addAll(
|
||||
list..removeWhere((e) => _cacheUpList?.contains(e) == true),
|
||||
)
|
||||
..refresh();
|
||||
}
|
||||
|
||||
isQuerying = false;
|
||||
}
|
||||
|
||||
late bool isQuerying = false;
|
||||
Future<void> queryFollowUp() async {
|
||||
if (isQuerying) return;
|
||||
isQuerying = true;
|
||||
|
||||
if (!accountService.isLogin.value) {
|
||||
upData
|
||||
..value.errMsg = '账号未登录'
|
||||
..refresh();
|
||||
upState.value = const Error(null);
|
||||
isQuerying = false;
|
||||
return;
|
||||
}
|
||||
upData.value.errMsg = null;
|
||||
if (Pref.dynamicsShowAllFollowedUp) {
|
||||
allFollowedUpsPage = 1;
|
||||
final f1 = DynamicsHttp.followUp();
|
||||
final f2 = FollowHttp.followings(
|
||||
vmid: accountService.mid,
|
||||
pn: allFollowedUpsPage,
|
||||
orderType: 'attention',
|
||||
ps: 50,
|
||||
);
|
||||
final res0 = await f1;
|
||||
if (!res0.isSuccess) {
|
||||
SmartDialog.showToast("获取关注动态失败:$res0");
|
||||
upData
|
||||
..value.errMsg = (res0 as Error).errMsg
|
||||
..refresh();
|
||||
} else {
|
||||
upData
|
||||
..value.liveUsers = res0.data.liveUsers
|
||||
..refresh();
|
||||
hasUpdatedUps = res0.data.upList!;
|
||||
}
|
||||
List<UpItem> allFollowedUps = <UpItem>[];
|
||||
final res1 = await f2;
|
||||
if (!res1.isSuccess) {
|
||||
SmartDialog.showToast("获取关注列表失败:$res1");
|
||||
} else {
|
||||
allFollowedUps = res1.data.list!
|
||||
.where((e) => hasUpdatedUps.every((e1) => e.mid != e1.mid))
|
||||
.map(
|
||||
(e) => UpItem(
|
||||
face: e.face,
|
||||
mid: e.mid,
|
||||
uname: e.uname,
|
||||
hasUpdate: false,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
allFollowedUpsPage += 1;
|
||||
allFollowedUpsTotal = res1.data.total!;
|
||||
}
|
||||
upData
|
||||
..value.upList = hasUpdatedUps + allFollowedUps
|
||||
..refresh();
|
||||
} else {
|
||||
var res = await DynamicsHttp.followUp();
|
||||
if (res.isSuccess) {
|
||||
upData.value = res.data;
|
||||
if (upData.value.upList.isNullOrEmpty) {
|
||||
mid.value = -1;
|
||||
|
||||
final res = await Future.wait([
|
||||
DynamicsHttp.followUp(),
|
||||
if (showAllUp)
|
||||
FollowHttp.followings(
|
||||
vmid: accountService.mid,
|
||||
pn: _upPage,
|
||||
orderType: 'attention',
|
||||
ps: 50,
|
||||
),
|
||||
]);
|
||||
|
||||
final first = res.first;
|
||||
final second = res.getOrNull(1);
|
||||
if (first.isSuccess) {
|
||||
FollowUpModel data = first.data as FollowUpModel;
|
||||
if (second != null && second.isSuccess) {
|
||||
_cacheUpList = List<UpItem>.from(data.upList);
|
||||
FollowData data1 = second.data as FollowData;
|
||||
final list1 = data1.list;
|
||||
|
||||
_upPage++;
|
||||
if (list1.isEmpty || list1.length >= (data1.total ?? 0)) {
|
||||
_upEnd = true;
|
||||
}
|
||||
} else {
|
||||
upData
|
||||
..value.errMsg = (res as Error).errMsg
|
||||
..refresh();
|
||||
|
||||
final list = data.upList;
|
||||
list.addAll(list1..removeWhere((e) => list.contains(e)));
|
||||
}
|
||||
upState.value = Success(data);
|
||||
} else {
|
||||
upState.value = const Error(null);
|
||||
}
|
||||
|
||||
isQuerying = false;
|
||||
}
|
||||
|
||||
@@ -177,6 +166,10 @@ class DynamicsController extends GetxController
|
||||
|
||||
@override
|
||||
Future<void> onRefresh() async {
|
||||
if (showAllUp) {
|
||||
_upPage = 1;
|
||||
_cacheUpList = null;
|
||||
}
|
||||
queryFollowUp();
|
||||
await controller?.onRefresh();
|
||||
}
|
||||
@@ -212,7 +205,9 @@ class DynamicsController extends GetxController
|
||||
@override
|
||||
void onClose() {
|
||||
tabController.dispose();
|
||||
scrollController.dispose();
|
||||
scrollController
|
||||
..removeListener(listener)
|
||||
..dispose();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user