From c4e44183b0c4bbbfe9b23f3fabebbad2f868bd32 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 16 Jul 2021 09:50:18 +0900 Subject: [PATCH] minor fix --- lib/widgets/viewer/entry_viewer_stack.dart | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 4ea43fd72..5b38033bd 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -18,6 +18,7 @@ import 'package:aves/widgets/viewer/entry_vertical_pager.dart'; import 'package:aves/widgets/viewer/hero.dart'; import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; import 'package:aves/widgets/viewer/overlay/bottom/common.dart'; import 'package:aves/widgets/viewer/overlay/bottom/panorama.dart'; import 'package:aves/widgets/viewer/overlay/bottom/video.dart'; @@ -62,6 +63,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, EdgeInsets? _frozenViewInsets, _frozenViewPadding; late VideoActionDelegate _videoActionDelegate; final List>> _viewStateNotifiers = []; + final Map Function()> _multiPageControllerPageListeners = {}; final ValueNotifier _heroInfoNotifier = ValueNotifier(null); bool _isEntryTracked = true; @@ -111,7 +113,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, _videoActionDelegate = VideoActionDelegate( collection: collection, ); - _initEntryControllers(); + _initEntryControllers(entry); _registerWidget(widget); WidgetsBinding.instance!.addObserver(this); WidgetsBinding.instance!.addPostFrameCallback((_) => _initOverlay()); @@ -129,6 +131,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, @override void dispose() { + _cleanEntryControllers(_entryNotifier.value); _videoActionDelegate.dispose(); _overlayAnimationController.dispose(); _overlayVisible.removeListener(_onOverlayVisibleChange); @@ -454,10 +457,11 @@ class _EntryViewerStackState extends State with FeedbackMixin, final newEntry = _currentHorizontalPage < entries.length ? entries[_currentHorizontalPage] : null; if (_entryNotifier.value == newEntry) return; + _cleanEntryControllers(_entryNotifier.value); _entryNotifier.value = newEntry; _isEntryTracked = false; await _pauseVideoControllers(); - await _initEntryControllers(); + await _initEntryControllers(newEntry); } void _popVisual() { @@ -549,8 +553,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, // state controllers/monitors - Future _initEntryControllers() async { - final entry = _entryNotifier.value; + Future _initEntryControllers(AvesEntry? entry) async { if (entry == null) return; _initViewStateController(entry); @@ -562,6 +565,14 @@ class _EntryViewerStackState extends State with FeedbackMixin, } } + void _cleanEntryControllers(AvesEntry? entry) { + if (entry == null) return; + + if (entry.isMultiPage) { + _cleanMultiPageController(entry); + } + } + void _initViewStateController(AvesEntry entry) { final uri = entry.uri; var controller = _viewStateNotifiers.firstWhereOrNull((kv) => kv.item1 == uri); @@ -617,11 +628,22 @@ class _EntryViewerStackState extends State with FeedbackMixin, } } + _multiPageControllerPageListeners[multiPageController] = _onPageChange; multiPageController.pageNotifier.addListener(_onPageChange); await _onPageChange(); } } + Future _cleanMultiPageController(AvesEntry entry) async { + final multiPageController = _multiPageControllerPageListeners.keys.firstWhereOrNull((v) => v.entry == entry); + if (multiPageController != null) { + final _onPageChange = _multiPageControllerPageListeners.remove(multiPageController); + if (_onPageChange != null) { + multiPageController.pageNotifier.removeListener(_onPageChange); + } + } + } + Future _playVideo(AvesVideoController videoController, bool Function() isCurrent) async { // video decoding may fail or have initial artifacts when the player initializes // during this widget initialization (because of the page transition and hero animation?)