From 87bb1327df021787c00cd596e807ef9bed78e6df Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 31 Jan 2021 14:57:35 +0900 Subject: [PATCH] viewer: fixed view and minimap refresh after rotation --- lib/widgets/viewer/overlay/minimap.dart | 25 ++++++------ .../viewer/visual/entry_page_view.dart | 38 +++++++++++-------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/lib/widgets/viewer/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart index 794de067a..3aea62b92 100644 --- a/lib/widgets/viewer/overlay/minimap.dart +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -35,29 +35,32 @@ class Minimap extends StatelessWidget { valueListenable: multiPageController.pageNotifier, builder: (context, page, child) { final pageEntry = mainEntry.getPageEntry(multiPageInfo?.getByIndex(page)); - return _buildForEntrySize(pageEntry.displaySize); + return _buildForEntrySize(pageEntry); }, ); }) - : _buildForEntrySize(mainEntry.displaySize), + : _buildForEntrySize(mainEntry), ); } - Widget _buildForEntrySize(Size entrySize) { + Widget _buildForEntrySize(AvesEntry entry) { return ValueListenableBuilder( valueListenable: viewStateNotifier, builder: (context, viewState, child) { final viewportSize = viewState.viewportSize; if (viewportSize == null) return SizedBox.shrink(); - return CustomPaint( - painter: MinimapPainter( - viewportSize: viewportSize, - entrySize: entrySize, - viewCenterOffset: viewState.position, - viewScale: viewState.scale, - minimapBorderColor: Colors.white30, + return AnimatedBuilder( + animation: entry.imageChangeNotifier, + builder: (context, child) => CustomPaint( + painter: MinimapPainter( + viewportSize: viewportSize, + entrySize: entry.displaySize, + viewCenterOffset: viewState.position, + viewScale: viewState.scale, + minimapBorderColor: Colors.white30, + ), + size: size, ), - size: size, ); }); } diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index ea17a2478..ba18f7473 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -111,7 +111,7 @@ class _EntryPageViewState extends State { } void _unregisterWidget() { - _magnifierController.dispose(); + _magnifierController?.dispose(); _subscriptions ..forEach((sub) => sub.cancel()) ..clear(); @@ -119,19 +119,25 @@ class _EntryPageViewState extends State { @override Widget build(BuildContext context) { - Widget child; - if (entry.isVideo) { - if (!entry.displaySize.isEmpty) { - child = _buildVideoView(); - } - } else if (entry.isSvg) { - child = _buildSvgView(); - } else if (entry.canDecode) { - child = _buildRasterView(); - } - child ??= ErrorView( - entry: entry, - onTap: () => onTap?.call(null), + final child = AnimatedBuilder( + animation: entry.imageChangeNotifier, + builder: (context, child) { + Widget child; + if (entry.isVideo) { + if (!entry.displaySize.isEmpty) { + child = _buildVideoView(); + } + } else if (entry.isSvg) { + child = _buildSvgView(); + } else if (entry.canDecode) { + child = _buildRasterView(); + } + child ??= ErrorView( + entry: entry, + onTap: () => onTap?.call(null), + ); + return child; + }, ); return widget.heroTag != null @@ -201,8 +207,8 @@ class _EntryPageViewState extends State { @required Widget child, }) { return Magnifier( - // key includes size and orientation to refresh when the image is rotated - key: ValueKey('${entry.pageId}_${entry.rotationDegrees}_${entry.isFlipped}_${entry.width}_${entry.height}_${entry.path}'), + // key includes modified date to refresh when the image is modified by metadata (e.g. rotated) + key: ValueKey('${entry.pageId}_${entry.dateModifiedSecs}'), controller: _magnifierController, childSize: entry.displaySize, minScale: minScale,