refa query follow up

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-07-31 15:00:23 +08:00
parent 1029621b63
commit e945daba3a
8 changed files with 168 additions and 204 deletions

View File

@@ -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();
}
}