From f9f17bcf09b17a8b915796e2585986e9faafd9ee Mon Sep 17 00:00:00 2001 From: guozhigq Date: Tue, 29 Oct 2024 22:48:02 +0800 Subject: [PATCH] update: positionedList plugin --- lib/common/pages_bottom_sheet.dart | 69 ++++++++++++-------- lib/pages/bangumi/widgets/bangumi_panel.dart | 2 - pubspec.lock | 8 +-- pubspec.yaml | 2 +- 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/lib/common/pages_bottom_sheet.dart b/lib/common/pages_bottom_sheet.dart index afc74bd2..d7872f13 100644 --- a/lib/common/pages_bottom_sheet.dart +++ b/lib/common/pages_bottom_sheet.dart @@ -5,7 +5,7 @@ import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/models/video_detail_res.dart'; import 'package:pilipala/utils/utils.dart'; -import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; +import 'package:scrollview_observer/scrollview_observer.dart'; import '../models/common/video_episode_type.dart'; import 'widgets/badge.dart'; import 'widgets/stat/danmu.dart'; @@ -83,7 +83,8 @@ class PagesBottomSheet extends StatefulWidget { } class _PagesBottomSheetState extends State { - final ItemScrollController _itemScrollController = ItemScrollController(); + final ScrollController _listScrollController = ScrollController(); + late ListObserverController _listObserverController; final ScrollController _scrollController = ScrollController(); late int currentIndex; @@ -92,10 +93,17 @@ class _PagesBottomSheetState extends State { super.initState(); currentIndex = widget.episodes.indexWhere((dynamic e) => e.cid == widget.currentCid); + _listObserverController = + ListObserverController(controller: _listScrollController); + if (widget.dataType == VideoEpidoesType.videoEpisode) { + _listObserverController.initialIndexModel = ObserverIndexPositionModel( + index: currentIndex, + isFixedHeight: true, + ); + } + WidgetsBinding.instance.addPostFrameCallback((_) { - if (widget.dataType == VideoEpidoesType.videoEpisode) { - _itemScrollController.jumpTo(index: currentIndex); - } else { + if (widget.dataType != VideoEpidoesType.videoEpisode) { double itemHeight = (widget.isFullScreen ? 400 : Get.size.width - 3 * StyleString.safeSpace) / @@ -118,6 +126,12 @@ class _PagesBottomSheetState extends State { return '选集'; } + @override + void dispose() { + _listObserverController.controller?.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return StatefulBuilder( @@ -136,27 +150,30 @@ class _PagesBottomSheetState extends State { Expanded( child: Material( child: widget.dataType == VideoEpidoesType.videoEpisode - ? ScrollablePositionedList.builder( - itemScrollController: _itemScrollController, - itemCount: widget.episodes.length + 1, - itemBuilder: (BuildContext context, int index) { - bool isLastItem = index == widget.episodes.length; - bool isCurrentIndex = currentIndex == index; - return isLastItem - ? SizedBox( - height: - MediaQuery.of(context).padding.bottom + - 20, - ) - : EpisodeListItem( - episode: widget.episodes[index], - index: index, - isCurrentIndex: isCurrentIndex, - dataType: widget.dataType, - changeFucCall: widget.changeFucCall, - isFullScreen: widget.isFullScreen, - ); - }, + ? ListViewObserver( + controller: _listObserverController, + child: ListView.builder( + controller: _listScrollController, + itemCount: widget.episodes.length + 1, + itemBuilder: (BuildContext context, int index) { + bool isLastItem = index == widget.episodes.length; + bool isCurrentIndex = currentIndex == index; + return isLastItem + ? SizedBox( + height: + MediaQuery.of(context).padding.bottom + + 20, + ) + : EpisodeListItem( + episode: widget.episodes[index], + index: index, + isCurrentIndex: isCurrentIndex, + dataType: widget.dataType, + changeFucCall: widget.changeFucCall, + isFullScreen: widget.isFullScreen, + ); + }, + ), ) : Padding( padding: const EdgeInsets.symmetric( diff --git a/lib/pages/bangumi/widgets/bangumi_panel.dart b/lib/pages/bangumi/widgets/bangumi_panel.dart index db29d8e2..cdca500c 100644 --- a/lib/pages/bangumi/widgets/bangumi_panel.dart +++ b/lib/pages/bangumi/widgets/bangumi_panel.dart @@ -7,7 +7,6 @@ import 'package:hive/hive.dart'; import 'package:pilipala/models/bangumi/info.dart'; import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/utils/storage.dart'; -import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import '../../../common/pages_bottom_sheet.dart'; import '../../../models/common/video_episode_type.dart'; import '../introduction/controller.dart'; @@ -44,7 +43,6 @@ class _BangumiPanelState extends State { late int cid; String heroTag = Get.arguments['heroTag']; late final VideoDetailController videoDetailCtr; - final ItemScrollController itemScrollController = ItemScrollController(); late PersistentBottomSheetController? _bottomSheetController; @override diff --git a/pubspec.lock b/pubspec.lock index 8050b857..35e34ab9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1434,14 +1434,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.1.3" - scrollable_positioned_list: + scrollview_observer: dependency: "direct main" description: - name: scrollable_positioned_list - sha256: "1b54d5f1329a1e263269abc9e2543d90806131aa14fe7c6062a8054d57249287" + name: scrollview_observer + sha256: fa408bcfd41e19da841eb53fc471f8f952d5ef818b854d2505c4bb3f0c876381 url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.8" + version: "1.22.0" sentry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0b9711ad..db58395b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -134,7 +134,7 @@ dependencies: # 极验 gt3_flutter_plugin: ^0.1.0 uuid: ^3.0.7 - scrollable_positioned_list: ^0.3.8 + scrollview_observer: ^1.22.0 catcher_2: ^1.2.6 logger: ^2.3.0 path: ^1.9.0