feat: 动态侧栏新增按最常访问显示所有已关注Up功能;抽屉式侧栏限制安全域

This commit is contained in:
orz12
2024-07-11 17:36:47 +08:00
parent e69c723e19
commit 99224640d8
6 changed files with 96 additions and 7 deletions

View File

@@ -73,14 +73,14 @@ class UpItem {
UpItem({ UpItem({
this.face, this.face,
this.hasUpdate, this.hasUpdate,
this.isReserveRecall, // this.isReserveRecall,
this.mid, this.mid,
this.uname, this.uname,
}); });
String? face; String? face;
bool? hasUpdate; bool? hasUpdate;
bool? isReserveRecall; // bool? isReserveRecall;
int? mid; int? mid;
String? uname; String? uname;
String type = 'up'; String type = 'up';
@@ -88,7 +88,7 @@ class UpItem {
UpItem.fromJson(Map<String, dynamic> json) { UpItem.fromJson(Map<String, dynamic> json) {
face = json['face']; face = json['face'];
hasUpdate = json['has_update']; hasUpdate = json['has_update'];
isReserveRecall = json['is_reserve_recall']; // isReserveRecall = json['is_reserve_recall'];
mid = json['mid']; mid = json['mid'];
uname = json['uname']; uname = json['uname'];
} }

View File

@@ -1,5 +1,6 @@
// ignore_for_file: avoid_print // ignore_for_file: avoid_print
import 'package:PiliPalaX/http/follow.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.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/storage.dart';
import 'package:PiliPalaX/utils/utils.dart'; import 'package:PiliPalaX/utils/utils.dart';
import '../../models/follow/result.dart';
class DynamicsController extends GetxController class DynamicsController extends GetxController
with GetTickerProviderStateMixin { with GetTickerProviderStateMixin {
String? offset = ''; String? offset = '';
@@ -35,6 +38,10 @@ class DynamicsController extends GetxController
var userInfo; var userInfo;
RxBool isLoadingDynamic = false.obs; RxBool isLoadingDynamic = false.obs;
Box setting = GStorage.setting; Box setting = GStorage.setting;
List<UpItem> hasUpdatedUps = <UpItem>[];
List<UpItem> allFollowedUps = <UpItem>[];
int allFollowedUpsPage = 1;
int allFollowedUpsTotal = 0;
@override @override
void onInit() { 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 { Future queryFollowUp({type = 'init'}) async {
if (!userLogin.value) { if (!userLogin.value) {
return {'status': false, 'msg': '账号未登录'}; return {'status': false, 'msg': '账号未登录'};
@@ -213,6 +248,41 @@ class DynamicsController extends GetxController
upData.value.upList = []; upData.value.upList = [];
upData.value.liveUsers = LiveUsers(); 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(); var res = await DynamicsHttp.followUp();
if (res['status']) { if (res['status']) {
upData.value = res['data']; upData.value = res['data'];

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:PiliPalaX/models/common/dynamics_type.dart'; import 'package:PiliPalaX/models/common/dynamics_type.dart';
import 'package:PiliPalaX/models/common/up_panel_position.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/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -57,6 +58,17 @@ class _DynamicsPageState extends State<DynamicsPage>
defaultValue: UpPanelPosition.leftFixed.code)]; defaultValue: UpPanelPosition.leftFixed.code)];
print('upPanelPosition: $upPanelPosition'); print('upPanelPosition: $upPanelPosition');
scrollController = _dynamicsController.scrollController; 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 @override
@@ -102,7 +114,6 @@ class _DynamicsPageState extends State<DynamicsPage>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print('upPanelPosition1: $upPanelPosition');
super.build(context); super.build(context);
return Scaffold( return Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -145,11 +156,11 @@ class _DynamicsPageState extends State<DynamicsPage>
})), })),
), ),
drawer: upPanelPosition == UpPanelPosition.leftDrawer drawer: upPanelPosition == UpPanelPosition.leftDrawer
? upPanelPart() ? SafeArea(child: upPanelPart())
: null, : null,
drawerEnableOpenDragGesture: true, drawerEnableOpenDragGesture: true,
endDrawer: upPanelPosition == UpPanelPosition.rightDrawer endDrawer: upPanelPosition == UpPanelPosition.rightDrawer
? upPanelPart() ? SafeArea(child: upPanelPart())
: null, : null,
endDrawerEnableOpenDragGesture: true, endDrawerEnableOpenDragGesture: true,
body: Row(children: [ body: Row(children: [

View File

@@ -257,7 +257,7 @@ class _ExtraSettingState extends State<ExtraSetting> {
return SelectDialog<int>( return SelectDialog<int>(
title: '动态展示', title: '动态展示',
value: defaultDynamicType, value: defaultDynamicType,
values: DynamicsType.values.map((e) { values: DynamicsType.values.sublist(0, 4).map((e) {
return {'title': e.labels, 'value': e.index}; return {'title': e.labels, 'value': e.index};
}).toList()); }).toList());
}, },

View File

@@ -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( ListTile(
dense: false, dense: false,
onTap: () => settingController.setDynamicBadgeMode(context), onTap: () => settingController.setDynamicBadgeMode(context),

View File

@@ -183,6 +183,7 @@ class SettingBoxKey {
'videoPlayerShowStatusBarBackgroundColor', // 播放页状态栏显示为背景色 'videoPlayerShowStatusBarBackgroundColor', // 播放页状态栏显示为背景色
dynamicsWaterfallFlow = 'dynamicsWaterfallFlow', // 动态瀑布流 dynamicsWaterfallFlow = 'dynamicsWaterfallFlow', // 动态瀑布流
upPanelPosition = 'upPanelPosition', // up主面板位置 upPanelPosition = 'upPanelPosition', // up主面板位置
dynamicsShowAllFollowedUp = 'dynamicsShowAllFollowedUp', // 动态显示全部关注up
useSideBar = 'useSideBar', useSideBar = 'useSideBar',
enableMYBar = 'enableMYBar', enableMYBar = 'enableMYBar',
hideSearchBar = 'hideSearchBar', // 收起顶栏 hideSearchBar = 'hideSearchBar', // 收起顶栏