mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-29 05:40:17 +08:00
@@ -14,6 +14,7 @@ import 'package:PiliPlus/models_new/space/space/setting.dart';
|
||||
import 'package:PiliPlus/models_new/space/space/tab2.dart';
|
||||
import 'package:PiliPlus/pages/common/common_data_controller.dart';
|
||||
import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:PiliPlus/utils/extension/nested_scroll_ext.dart';
|
||||
import 'package:PiliPlus/utils/request_utils.dart';
|
||||
import 'package:PiliPlus/utils/share_utils.dart';
|
||||
import 'package:PiliPlus/utils/storage_pref.dart';
|
||||
@@ -59,7 +60,7 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
|
||||
|
||||
final fromViewAid = Get.parameters['from_view_aid'];
|
||||
|
||||
final key = GlobalKey<ExtendedNestedScrollViewState>();
|
||||
final scrollKey = GlobalKey<ExtendedNestedScrollViewState>();
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
@@ -255,13 +256,8 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
|
||||
}
|
||||
|
||||
void onTapTab(int value) {
|
||||
if (tabController?.indexIsChanging == false &&
|
||||
key.currentState?.outerController.hasClients == true) {
|
||||
key.currentState!.outerController.animateTo(
|
||||
key.currentState!.outerController.offset,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
curve: Curves.easeInOut,
|
||||
);
|
||||
if (tabController?.indexIsChanging == false) {
|
||||
scrollKey.currentState?.animToTop();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ class _MemberPageState extends State<MemberPage> {
|
||||
() => switch (_userController.loadingState.value) {
|
||||
Loading() => m3eLoading,
|
||||
Success(:final response) => ExtendedNestedScrollView(
|
||||
key: _userController.key,
|
||||
key: _userController.scrollKey,
|
||||
onlyOneScrollInBody: true,
|
||||
pinnedHeaderSliverHeightBuilder: () =>
|
||||
kToolbarHeight + MediaQuery.viewPaddingOf(context).top,
|
||||
|
||||
@@ -11,7 +11,6 @@ import 'package:PiliPlus/pages/member/controller.dart';
|
||||
import 'package:PiliPlus/pages/member_video/controller.dart';
|
||||
import 'package:PiliPlus/pages/member_video/widgets/video_card_h_member_video.dart';
|
||||
import 'package:PiliPlus/utils/grid.dart';
|
||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
@@ -53,19 +52,18 @@ class _MemberVideoState extends State<MemberVideo>
|
||||
|
||||
late final MemberVideoCtr _controller;
|
||||
|
||||
int? _index;
|
||||
late ExtendedNestedScrollController _scrollController;
|
||||
|
||||
void _jumpToIndex(int index) {
|
||||
final scrollOffset = gridDelegate.layoutCache!
|
||||
.getGeometryForChildIndex(index)
|
||||
.scrollOffset;
|
||||
try {
|
||||
_scrollController.nestedPositions
|
||||
.elementAt(_index!)
|
||||
.localJumpTo(scrollOffset);
|
||||
final state = Get.find<MemberController>(
|
||||
tag: widget.heroTag,
|
||||
).scrollKey.currentState;
|
||||
if (state != null && state.mounted) {
|
||||
state.innerNestedPositions.first.localJumpTo(scrollOffset);
|
||||
}
|
||||
} catch (e) {
|
||||
_scrollController.jumpTo(scrollOffset);
|
||||
if (kDebugMode) debugPrint('jump error: $e');
|
||||
}
|
||||
}
|
||||
@@ -118,12 +116,6 @@ class _MemberVideoState extends State<MemberVideo>
|
||||
),
|
||||
);
|
||||
if (_controller.isVideo && _controller.fromViewAid?.isNotEmpty == true) {
|
||||
if (_index == null) {
|
||||
_scrollController =
|
||||
PrimaryScrollController.of(this.context)
|
||||
as ExtendedNestedScrollController;
|
||||
_index = _scrollController.nestedPositions.length;
|
||||
}
|
||||
return Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
|
||||
@@ -54,6 +54,7 @@ import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:PiliPlus/utils/connectivity_utils.dart';
|
||||
import 'package:PiliPlus/utils/extension/context_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/nested_scroll_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/size_ext.dart';
|
||||
import 'package:PiliPlus/utils/page_utils.dart';
|
||||
@@ -187,9 +188,7 @@ class VideoDetailController extends GetxController
|
||||
)..addListener(_animListener));
|
||||
|
||||
void refreshPage() {
|
||||
if (scrollKey.currentState?.mounted ?? false) {
|
||||
(scrollKey.currentState!.context as Element).markNeedsBuild();
|
||||
}
|
||||
scrollKey.currentState?.refresh();
|
||||
}
|
||||
|
||||
void _animListener() {
|
||||
@@ -217,14 +216,7 @@ class VideoDetailController extends GetxController
|
||||
}
|
||||
|
||||
void animToTop() {
|
||||
final outerController = scrollKey.currentState!.outerController;
|
||||
if (outerController.hasClients) {
|
||||
outerController.animateTo(
|
||||
outerController.offset,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
curve: Curves.easeInOut,
|
||||
);
|
||||
}
|
||||
scrollKey.currentState?.animToTop();
|
||||
}
|
||||
|
||||
bool _needAnimOnDimensionChanged(bool isVertical) {
|
||||
|
||||
@@ -71,9 +71,9 @@ class LocalIntroController extends CommonIntroController {
|
||||
if (index != 0) {
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
try {
|
||||
if (videoDetailCtr.scrollKey.currentState?.mounted ?? false) {
|
||||
(videoDetailCtr.scrollKey.currentState!.innerController
|
||||
as ExtendedNestedScrollController)
|
||||
final state = videoDetailCtr.scrollKey.currentState;
|
||||
if (state != null && state.mounted) {
|
||||
(state.innerController as ExtendedNestedScrollController)
|
||||
.nestedPositions
|
||||
.first
|
||||
.localJumpTo(_offset);
|
||||
|
||||
26
lib/utils/extension/nested_scroll_ext.dart
Normal file
26
lib/utils/extension/nested_scroll_ext.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
|
||||
show ExtendedNestedScrollViewState;
|
||||
import 'package:flutter/widgets.dart' show Element, Curves;
|
||||
|
||||
extension ExtendedNestedScrollViewStateExt on ExtendedNestedScrollViewState {
|
||||
void refresh() {
|
||||
if (mounted) {
|
||||
(context as Element).markNeedsBuild();
|
||||
}
|
||||
}
|
||||
|
||||
void animToTop() {
|
||||
if (mounted) {
|
||||
final position = innerNestedPositions.first;
|
||||
if (position.pixels >= position.viewportDimension * 7) {
|
||||
position.localJumpTo(0);
|
||||
} else {
|
||||
outerController.animateTo(
|
||||
outerController.offset,
|
||||
curve: Curves.easeInOut,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -485,7 +485,7 @@ packages:
|
||||
description:
|
||||
path: "."
|
||||
ref: mod
|
||||
resolved-ref: "4f39947d2ceda6fa56503e0efc794fcf0d4ef5a6"
|
||||
resolved-ref: "161cd202c20bf0ba2394e3a86381d58864dc9e4e"
|
||||
url: "https://github.com/bggRGjQaUbCoE/extended_nested_scroll_view.git"
|
||||
source: git
|
||||
version: "6.2.1"
|
||||
|
||||
Reference in New Issue
Block a user