mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-20 00:56:31 +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.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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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: '清空',
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}',
|
||||||
|
|||||||
Reference in New Issue
Block a user