mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: 动态侧栏新增按最常访问显示所有已关注Up功能;抽屉式侧栏限制安全域
This commit is contained in:
@@ -73,14 +73,14 @@ class UpItem {
|
||||
UpItem({
|
||||
this.face,
|
||||
this.hasUpdate,
|
||||
this.isReserveRecall,
|
||||
// this.isReserveRecall,
|
||||
this.mid,
|
||||
this.uname,
|
||||
});
|
||||
|
||||
String? face;
|
||||
bool? hasUpdate;
|
||||
bool? isReserveRecall;
|
||||
// bool? isReserveRecall;
|
||||
int? mid;
|
||||
String? uname;
|
||||
String type = 'up';
|
||||
@@ -88,7 +88,7 @@ class UpItem {
|
||||
UpItem.fromJson(Map<String, dynamic> json) {
|
||||
face = json['face'];
|
||||
hasUpdate = json['has_update'];
|
||||
isReserveRecall = json['is_reserve_recall'];
|
||||
// isReserveRecall = json['is_reserve_recall'];
|
||||
mid = json['mid'];
|
||||
uname = json['uname'];
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// ignore_for_file: avoid_print
|
||||
|
||||
import 'package:PiliPalaX/http/follow.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
@@ -17,6 +18,8 @@ import 'package:PiliPalaX/utils/id_utils.dart';
|
||||
import 'package:PiliPalaX/utils/storage.dart';
|
||||
import 'package:PiliPalaX/utils/utils.dart';
|
||||
|
||||
import '../../models/follow/result.dart';
|
||||
|
||||
class DynamicsController extends GetxController
|
||||
with GetTickerProviderStateMixin {
|
||||
String? offset = '';
|
||||
@@ -35,6 +38,10 @@ class DynamicsController extends GetxController
|
||||
var userInfo;
|
||||
RxBool isLoadingDynamic = false.obs;
|
||||
Box setting = GStorage.setting;
|
||||
List<UpItem> hasUpdatedUps = <UpItem>[];
|
||||
List<UpItem> allFollowedUps = <UpItem>[];
|
||||
int allFollowedUpsPage = 1;
|
||||
int allFollowedUpsTotal = 0;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
@@ -205,6 +212,34 @@ class DynamicsController extends GetxController
|
||||
}
|
||||
}
|
||||
|
||||
Future queryFollowing2() async {
|
||||
if (allFollowedUps.length >= allFollowedUpsTotal) {
|
||||
SmartDialog.showToast('没有更多了');
|
||||
return;
|
||||
}
|
||||
var res = await FollowHttp.followings(
|
||||
vmid: userInfo.mid,
|
||||
pn: allFollowedUpsPage,
|
||||
ps: 50,
|
||||
orderType: 'attention',
|
||||
);
|
||||
if (res['status']) {
|
||||
allFollowedUps.addAll(res['data'].list.map<UpItem>((FollowItemModel e) =>
|
||||
UpItem(
|
||||
face: e.face,
|
||||
mid: e.mid,
|
||||
uname: e.uname,
|
||||
hasUpdate:
|
||||
hasUpdatedUps.any((element) => element.mid == e.mid))));
|
||||
allFollowedUpsPage += 1;
|
||||
allFollowedUpsTotal = res['data'].total;
|
||||
upData.value.upList = allFollowedUps;
|
||||
upData.refresh();
|
||||
} else {
|
||||
SmartDialog.showToast(res['msg']);
|
||||
}
|
||||
}
|
||||
|
||||
Future queryFollowUp({type = 'init'}) async {
|
||||
if (!userLogin.value) {
|
||||
return {'status': false, 'msg': '账号未登录'};
|
||||
@@ -213,6 +248,41 @@ class DynamicsController extends GetxController
|
||||
upData.value.upList = [];
|
||||
upData.value.liveUsers = LiveUsers();
|
||||
}
|
||||
if (setting.get(SettingBoxKey.dynamicsShowAllFollowedUp,
|
||||
defaultValue: false)) {
|
||||
allFollowedUpsPage = 1;
|
||||
Future f1 = DynamicsHttp.followUp();
|
||||
Future f2 = FollowHttp.followings(
|
||||
vmid: userInfo.mid,
|
||||
pn: allFollowedUpsPage,
|
||||
ps: 50,
|
||||
orderType: 'attention');
|
||||
List<dynamic> ress = await Future.wait([f1, f2]);
|
||||
if (!ress[0]['status']) {
|
||||
SmartDialog.showToast("获取关注动态失败:${ress[0]['msg']}");
|
||||
} else {
|
||||
upData.value.liveUsers = ress[0]['data'].liveUsers;
|
||||
hasUpdatedUps = ress[0]['data'].upList!;
|
||||
}
|
||||
if (!ress[1]['status']) {
|
||||
SmartDialog.showToast("获取关注列表失败:${ress[1]['msg']}");
|
||||
} else {
|
||||
allFollowedUps = ress[1]['data']
|
||||
.list
|
||||
.map<UpItem>((FollowItemModel e) => UpItem(
|
||||
face: e.face,
|
||||
mid: e.mid,
|
||||
uname: e.uname,
|
||||
hasUpdate:
|
||||
hasUpdatedUps.any((element) => element.mid == e.mid)))
|
||||
.toList();
|
||||
allFollowedUpsPage += 1;
|
||||
allFollowedUpsTotal = ress[1]['data'].total;
|
||||
}
|
||||
upData.value.upList =
|
||||
allFollowedUpsTotal > 0 ? allFollowedUps : hasUpdatedUps;
|
||||
return ress[0];
|
||||
}
|
||||
var res = await DynamicsHttp.followUp();
|
||||
if (res['status']) {
|
||||
upData.value = res['data'];
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
||||
|
||||
import 'package:PiliPalaX/models/common/dynamics_type.dart';
|
||||
import 'package:PiliPalaX/models/common/up_panel_position.dart';
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -57,6 +58,17 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
defaultValue: UpPanelPosition.leftFixed.code)];
|
||||
print('upPanelPosition: $upPanelPosition');
|
||||
scrollController = _dynamicsController.scrollController;
|
||||
if (GStorage.setting
|
||||
.get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) {
|
||||
scrollController.addListener(() {
|
||||
if (scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent - 300) {
|
||||
EasyThrottle.throttle('following', const Duration(seconds: 1), () {
|
||||
_dynamicsController.queryFollowing2();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -102,7 +114,6 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print('upPanelPosition1: $upPanelPosition');
|
||||
super.build(context);
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
@@ -145,11 +156,11 @@ class _DynamicsPageState extends State<DynamicsPage>
|
||||
})),
|
||||
),
|
||||
drawer: upPanelPosition == UpPanelPosition.leftDrawer
|
||||
? upPanelPart()
|
||||
? SafeArea(child: upPanelPart())
|
||||
: null,
|
||||
drawerEnableOpenDragGesture: true,
|
||||
endDrawer: upPanelPosition == UpPanelPosition.rightDrawer
|
||||
? upPanelPart()
|
||||
? SafeArea(child: upPanelPart())
|
||||
: null,
|
||||
endDrawerEnableOpenDragGesture: true,
|
||||
body: Row(children: [
|
||||
|
||||
@@ -257,7 +257,7 @@ class _ExtraSettingState extends State<ExtraSetting> {
|
||||
return SelectDialog<int>(
|
||||
title: '动态展示',
|
||||
value: defaultDynamicType,
|
||||
values: DynamicsType.values.map((e) {
|
||||
values: DynamicsType.values.sublist(0, 4).map((e) {
|
||||
return {'title': e.labels, 'value': e.index};
|
||||
}).toList());
|
||||
},
|
||||
|
||||
@@ -185,6 +185,13 @@ class _StyleSettingState extends State<StyleSetting> {
|
||||
}
|
||||
},
|
||||
),
|
||||
const SetSwitchItem(
|
||||
title: '动态页显示所有已关注Up主',
|
||||
subTitle: '并以最常访问排序Up',
|
||||
leading: Icon(Icons.people_alt_outlined),
|
||||
setKey: SettingBoxKey.dynamicsShowAllFollowedUp,
|
||||
defaultVal: false,
|
||||
),
|
||||
ListTile(
|
||||
dense: false,
|
||||
onTap: () => settingController.setDynamicBadgeMode(context),
|
||||
|
||||
@@ -183,6 +183,7 @@ class SettingBoxKey {
|
||||
'videoPlayerShowStatusBarBackgroundColor', // 播放页状态栏显示为背景色
|
||||
dynamicsWaterfallFlow = 'dynamicsWaterfallFlow', // 动态瀑布流
|
||||
upPanelPosition = 'upPanelPosition', // up主面板位置
|
||||
dynamicsShowAllFollowedUp = 'dynamicsShowAllFollowedUp', // 动态显示全部关注up
|
||||
useSideBar = 'useSideBar',
|
||||
enableMYBar = 'enableMYBar',
|
||||
hideSearchBar = 'hideSearchBar', // 收起顶栏
|
||||
|
||||
Reference in New Issue
Block a user