mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-19 16:46:22 +08:00
opt dyn topic
opt member opus Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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: '清空',
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}',
|
||||
|
||||
Reference in New Issue
Block a user