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

View File

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

View File

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

View File

@@ -123,11 +123,14 @@ class _DynTopicPageState extends State<DynTopicPage> {
} }
Widget _buildAppBar(ThemeData theme, LoadingState<TopDetails?> topState) { Widget _buildAppBar(ThemeData theme, LoadingState<TopDetails?> topState) {
late final paddingTop = MediaQuery.paddingOf(context).top;
return switch (topState) { return switch (topState) {
Loading() => const SliverAppBar(), Loading() => const SliverAppBar(),
Success(:var response) when (topState.dataOrNull != null) => Success(:var response) when (topState.dataOrNull != null) =>
DynamicSliverAppBarMedium( DynamicSliverAppBarMedium(
pinned: true, pinned: true,
callback: (value) => _controller.appbarOffset =
value - kToolbarHeight - paddingTop - 7,
title: IgnorePointer(child: Text(response!.topicItem!.name!)), title: IgnorePointer(child: Text(response!.topicItem!.name!)),
flexibleSpace: Container( flexibleSpace: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -140,7 +143,7 @@ class _DynTopicPageState extends State<DynTopicPage> {
), ),
), ),
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: MediaQuery.paddingOf(context).top, top: paddingTop,
left: 12, left: 12,
right: 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/video/controller.dart';
import 'package:PiliPlus/pages/fav_folder_sort/view.dart'; import 'package:PiliPlus/pages/fav_folder_sort/view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
class FavPage extends StatefulWidget { class FavPage extends StatefulWidget {
@@ -77,6 +78,10 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
() => _showVideoFavMenu.value () => _showVideoFavMenu.value
? IconButton( ? IconButton(
onPressed: () { onPressed: () {
if (!_favController.isEnd) {
SmartDialog.showToast('加载全部收藏夹再排序');
return;
}
Get.to(FavFolderSortPage(favController: _favController)); Get.to(FavFolderSortPage(favController: _favController));
}, },
icon: const Icon(Icons.sort), icon: const Icon(Icons.sort),

View File

@@ -147,6 +147,7 @@ class _LaterPageState extends State<LaterPage>
), ),
Material( Material(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
color: Colors.transparent,
borderRadius: const BorderRadius.all(Radius.circular(20)), borderRadius: const BorderRadius.all(Radius.circular(20)),
child: Builder( child: Builder(
key: sortKey, key: sortKey,
@@ -197,6 +198,7 @@ class _LaterPageState extends State<LaterPage>
), ),
Material( Material(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
color: Colors.transparent,
borderRadius: const BorderRadius.all(Radius.circular(20)), borderRadius: const BorderRadius.all(Radius.circular(20)),
child: PopupMenuButton( child: PopupMenuButton(
tooltip: '清空', 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/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.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/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';
@@ -48,6 +50,9 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
final fromViewAid = Get.parameters['from_view_aid']; final fromViewAid = Get.parameters['from_view_aid'];
final key = GlobalKey<ExtendedNestedScrollViewState>();
int offset = 120;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();

View File

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

View File

@@ -19,7 +19,7 @@ class MemberOpusController
String offset = ''; String offset = '';
Rx<SpaceTabFilter> type = Rx<SpaceTabFilter> type =
SpaceTabFilter(text: "全部图文", meta: "all", tabName: "图文").obs; const SpaceTabFilter(text: "全部图文", meta: "all", tabName: "图文").obs;
List<SpaceTabFilter>? filter; List<SpaceTabFilter>? filter;
@override @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/episodic_button.dart';
import 'package:PiliPlus/models/space_archive/item.dart'; import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_list_controller.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/extension.dart';
import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
@@ -22,6 +23,7 @@ class MemberVideoCtr
required this.seriesId, required this.seriesId,
this.username, this.username,
this.title, this.title,
this.heroTag,
}); });
ContributeType type; ContributeType type;
@@ -43,6 +45,9 @@ class MemberVideoCtr
bool? isLoadPrevious; bool? isLoadPrevious;
bool? hasPrev; bool? hasPrev;
String? heroTag;
late final MemberController _ctr = Get.find<MemberController>(tag: heroTag);
@override @override
Future<void> onRefresh() async { Future<void> onRefresh() async {
if (isLocating.value == true) { if (isLocating.value == true) {
@@ -222,6 +227,11 @@ class MemberVideoCtr
@override @override
Future<void> onReload() { Future<void> onReload() {
isLocating.value = null; 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(); return super.onReload();
} }
} }

View File

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