opt dyn topic

opt member opus

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-18 17:46:42 +08:00
parent 0de2603e30
commit 40502e3bff
11 changed files with 55 additions and 18 deletions

View File

@@ -43,8 +43,10 @@ class DynamicSliverAppBarMedium extends StatefulWidget {
this.forceMaterialTransparency = false,
this.clipBehavior,
this.appBarClipper,
this.callback,
});
final ValueChanged<double>? callback;
final Widget? flexibleSpace;
final Widget? leading;
final bool automaticallyImplyLeading;
@@ -112,6 +114,7 @@ class _DynamicSliverAppBarMediumState extends State<DynamicSliverAppBarMedium> {
_height = (_childKey.currentContext!.findRenderObject()! as RenderBox)
.size
.height;
widget.callback?.call(_height);
});
});
}

View File

@@ -1,19 +1,19 @@
class SpaceTabFilter {
SpaceTabFilter({
const SpaceTabFilter({
this.text,
required this.meta,
this.tabName,
});
String? text;
late String meta;
String? tabName;
final String? text;
final String meta;
final String? tabName;
SpaceTabFilter.fromJson(Map<String, dynamic> json) {
text = json['text'];
meta = json['meta'] ?? 'all';
tabName = json['tab_ame'];
}
factory SpaceTabFilter.fromJson(Map<String, dynamic> json) => SpaceTabFilter(
text: json['text'],
meta: json['meta'] ?? 'all',
tabName: json['tab_ame'],
);
@override
bool operator ==(Object other) {

View File

@@ -20,6 +20,8 @@ class DynTopicController
String offset = '';
Rx<TopicSortByConf?> topicSortByConf = Rx<TopicSortByConf?>(null);
double? appbarOffset;
// top
final isLogin = Accounts.main.isLogin;
Rx<bool?> isFav = Rx<bool?>(null);
@@ -63,7 +65,14 @@ class DynTopicController
@override
Future<void> onReload() {
scrollController.jumpToTop();
if (appbarOffset != null) {
if (scrollController.hasClients &&
scrollController.offset > appbarOffset!) {
scrollController.jumpTo(appbarOffset!);
}
} else {
scrollController.jumpToTop();
}
return super.onReload();
}

View File

@@ -123,11 +123,14 @@ class _DynTopicPageState extends State<DynTopicPage> {
}
Widget _buildAppBar(ThemeData theme, LoadingState<TopDetails?> topState) {
late final paddingTop = MediaQuery.paddingOf(context).top;
return switch (topState) {
Loading() => const SliverAppBar(),
Success(:var response) when (topState.dataOrNull != null) =>
DynamicSliverAppBarMedium(
pinned: true,
callback: (value) => _controller.appbarOffset =
value - kToolbarHeight - paddingTop - 7,
title: IgnorePointer(child: Text(response!.topicItem!.name!)),
flexibleSpace: Container(
decoration: BoxDecoration(
@@ -140,7 +143,7 @@ class _DynTopicPageState extends State<DynTopicPage> {
),
),
padding: EdgeInsets.only(
top: MediaQuery.paddingOf(context).top,
top: paddingTop,
left: 12,
right: 12,
),

View File

@@ -5,6 +5,7 @@ import 'package:PiliPlus/models/user/fav_folder.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
import 'package:PiliPlus/pages/fav_folder_sort/view.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class FavPage extends StatefulWidget {
@@ -77,6 +78,10 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
() => _showVideoFavMenu.value
? IconButton(
onPressed: () {
if (!_favController.isEnd) {
SmartDialog.showToast('加载全部收藏夹再排序');
return;
}
Get.to(FavFolderSortPage(favController: _favController));
},
icon: const Icon(Icons.sort),

View File

@@ -147,6 +147,7 @@ class _LaterPageState extends State<LaterPage>
),
Material(
clipBehavior: Clip.hardEdge,
color: Colors.transparent,
borderRadius: const BorderRadius.all(Radius.circular(20)),
child: Builder(
key: sortKey,
@@ -197,6 +198,7 @@ class _LaterPageState extends State<LaterPage>
),
Material(
clipBehavior: Clip.hardEdge,
color: Colors.transparent,
borderRadius: const BorderRadius.all(Radius.circular(20)),
child: PopupMenuButton(
tooltip: '清空',

View File

@@ -11,6 +11,8 @@ import 'package:PiliPlus/pages/common/common_data_controller.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
show ExtendedNestedScrollViewState;
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -48,6 +50,9 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
final fromViewAid = Get.parameters['from_view_aid'];
final key = GlobalKey<ExtendedNestedScrollViewState>();
int offset = 120;
@override
void onInit() {
super.onInit();

View File

@@ -28,8 +28,6 @@ class _MemberPageState extends State<MemberPage> {
late final int _mid;
late final String _heroTag;
late final MemberController _userController;
final _key = GlobalKey<ExtendedNestedScrollViewState>();
int _offset = 120;
@override
void initState() {
@@ -46,7 +44,7 @@ class _MemberPageState extends State<MemberPage> {
void listener() {
if (_userController.scrollController.hasClients) {
_userController.showUname.value =
_userController.scrollController.offset >= _offset;
_userController.scrollController.offset >= _userController.offset;
}
}
@@ -169,7 +167,7 @@ class _MemberPageState extends State<MemberPage> {
? LayoutBuilder(
builder: (context, constraints) {
return ExtendedNestedScrollView(
key: _key,
key: _userController.key,
controller: _userController.scrollController,
onlyOneScrollInBody: true,
pinnedHeaderSliverHeightBuilder: () {
@@ -213,7 +211,7 @@ class _MemberPageState extends State<MemberPage> {
tabs: _userController.tabs,
onTap: (value) {
if (_userController.tabController?.indexIsChanging == false) {
_key.currentState?.outerController.animToTop();
_userController.key.currentState?.outerController.animToTop();
}
},
),
@@ -253,7 +251,8 @@ class _MemberPageState extends State<MemberPage> {
toolbarHeight: kToolbarHeight + MediaQuery.paddingOf(context).top,
flexibleSpace: _buildUserInfo(_userController.loadingState.value, isV),
callback: (value) {
_offset = (value - 56 - MediaQuery.paddingOf(context).top).toInt();
_userController.offset =
(value - 56 - MediaQuery.paddingOf(context).top).toInt();
listener();
},
);

View File

@@ -19,7 +19,7 @@ class MemberOpusController
String offset = '';
Rx<SpaceTabFilter> type =
SpaceTabFilter(text: "全部图文", meta: "all", tabName: "图文").obs;
const SpaceTabFilter(text: "全部图文", meta: "all", tabName: "图文").obs;
List<SpaceTabFilter>? filter;
@override

View File

@@ -6,6 +6,7 @@ import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/episodic_button.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
@@ -22,6 +23,7 @@ class MemberVideoCtr
required this.seriesId,
this.username,
this.title,
this.heroTag,
});
ContributeType type;
@@ -43,6 +45,9 @@ class MemberVideoCtr
bool? isLoadPrevious;
bool? hasPrev;
String? heroTag;
late final MemberController _ctr = Get.find<MemberController>(tag: heroTag);
@override
Future<void> onRefresh() async {
if (isLocating.value == true) {
@@ -222,6 +227,11 @@ class MemberVideoCtr
@override
Future<void> onReload() {
isLocating.value = null;
if (_ctr.key.currentState?.outerController.hasClients == true) {
if (_ctr.key.currentState!.outerController.offset > _ctr.offset) {
_ctr.key.currentState!.outerController.jumpTo(_ctr.offset.toDouble());
}
}
return super.onReload();
}
}

View File

@@ -49,6 +49,7 @@ class _MemberVideoState extends State<MemberVideo>
seriesId: widget.seriesId,
username: Get.find<MemberController>(tag: widget.heroTag).username,
title: widget.title,
heroTag: widget.heroTag,
),
tag:
'${widget.heroTag}${widget.type.name}${widget.seasonId}${widget.seriesId}',