From 4d8e2d4123aa33a81cad95c5b8adebd6f92fc658 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 19 Jan 2021 18:58:01 +0900 Subject: [PATCH] multipage: reset magnifier state when page dimensions change --- .../viewer/visual/entry_page_view.dart | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index dc916af35..bd36e6722 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -53,7 +53,7 @@ class EntryPageView extends StatefulWidget { } class _EntryPageViewState extends State { - final MagnifierController _magnifierController = MagnifierController(); + MagnifierController _magnifierController; final ValueNotifier _viewStateNotifier = ValueNotifier(ViewState.zero); final List _subscriptions = []; @@ -64,17 +64,39 @@ class _EntryPageViewState extends State { @override void initState() { super.initState(); - _subscriptions.add(_magnifierController.stateStream.listen(_onViewStateChanged)); - _subscriptions.add(_magnifierController.scaleBoundariesStream.listen(_onViewScaleBoundariesChanged)); + _registerWidget(); + } + + @override + void didUpdateWidget(covariant EntryPageView oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.entry.displaySize != entry.displaySize) { + // do not reset the magnifier view state unless page dimensions change, + // in effect locking the zoom & position when browsing entry pages of the same size + _unregisterWidget(); + _registerWidget(); + } } @override void dispose() { + _unregisterWidget(); + widget.onDisposed?.call(); + super.dispose(); + } + + void _registerWidget() { + _viewStateNotifier.value = ViewState.zero; + _magnifierController = MagnifierController(); + _subscriptions.add(_magnifierController.stateStream.listen(_onViewStateChanged)); + _subscriptions.add(_magnifierController.scaleBoundariesStream.listen(_onViewScaleBoundariesChanged)); + } + + void _unregisterWidget() { _subscriptions ..forEach((sub) => sub.cancel()) ..clear(); - widget.onDisposed?.call(); - super.dispose(); } @override