From 18657eb980fd10c4ece0e1486419d19631a5578e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 13 Jun 2026 18:31:14 -0400 Subject: [PATCH 1/3] improved expandable image widget --- lib/widgets/expandable_image.dart | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/widgets/expandable_image.dart b/lib/widgets/expandable_image.dart index ddcffd8..dde82f6 100644 --- a/lib/widgets/expandable_image.dart +++ b/lib/widgets/expandable_image.dart @@ -1,7 +1,7 @@ -import "dart:math"; import "package:cross_cache/cross_cache.dart"; import "package:flutter/material.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:m3e_buttons/m3e_buttons.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; import "package:nexus/widgets/error_dialog.dart"; @@ -17,16 +17,21 @@ class ExpandableImage extends ConsumerWidget { ? null : () => showDialog( context: context, - builder: (_) => LayoutBuilder( - builder: (context, constraints) => Dialog( - backgroundColor: Colors.transparent, - insetPadding: .all(constraints.maxWidth / 100), - child: InteractiveViewer( - maxScale: 5, - child: ConstrainedBox( - constraints: .new( - minWidth: min(constraints.maxWidth, 1000), + builder: (_) => Stack( + children: [ + Align( + alignment: .topRight, + child: Padding( + padding: .all(32), + child: M3EButton( + onPressed: Navigator.of(context).pop, + child: Icon(Icons.close), ), + ), + ), + Center( + child: InteractiveViewer( + maxScale: 10, child: Image( fit: .contain, errorBuilder: (_, error, stackTrace) => ErrorDialog( @@ -41,7 +46,7 @@ class ExpandableImage extends ConsumerWidget { ), ), ), - ), + ], ), ), child: child, From 3349ca7253c6e5a7c526b3594aff864f22267c55 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 13 Jun 2026 18:44:02 -0400 Subject: [PATCH 2/3] wrap expanded image stack in a safearea to help with notch issues --- lib/widgets/expandable_image.dart | 56 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/widgets/expandable_image.dart b/lib/widgets/expandable_image.dart index dde82f6..ee230b1 100644 --- a/lib/widgets/expandable_image.dart +++ b/lib/widgets/expandable_image.dart @@ -17,36 +17,38 @@ class ExpandableImage extends ConsumerWidget { ? null : () => showDialog( context: context, - builder: (_) => Stack( - children: [ - Align( - alignment: .topRight, - child: Padding( - padding: .all(32), - child: M3EButton( - onPressed: Navigator.of(context).pop, - child: Icon(Icons.close), - ), - ), - ), - Center( - child: InteractiveViewer( - maxScale: 10, - child: Image( - fit: .contain, - errorBuilder: (_, error, stackTrace) => ErrorDialog( - "Loading failed for $source\nError: $error", - stackTrace, - ), - image: CachedNetworkImage( - source!, - ref.watch(CrossCacheController.provider), - headers: ref.headers, + builder: (_) => SafeArea( + child: Stack( + children: [ + Align( + alignment: .topRight, + child: Padding( + padding: .all(32), + child: M3EButton( + onPressed: Navigator.of(context).pop, + child: Icon(Icons.close), ), ), ), - ), - ], + Center( + child: InteractiveViewer( + maxScale: 10, + child: Image( + fit: .contain, + errorBuilder: (_, error, stackTrace) => ErrorDialog( + "Loading failed for $source\nError: $error", + stackTrace, + ), + image: CachedNetworkImage( + source!, + ref.watch(CrossCacheController.provider), + headers: ref.headers, + ), + ), + ), + ), + ], + ), ), ), child: child, From 2d0f41000ed81194468a41b44e5970eb9fcd487f Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 13 Jun 2026 20:49:45 -0400 Subject: [PATCH 3/3] improve expandable image viewer --- lib/widgets/expandable_image.dart | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/widgets/expandable_image.dart b/lib/widgets/expandable_image.dart index ee230b1..fdfabff 100644 --- a/lib/widgets/expandable_image.dart +++ b/lib/widgets/expandable_image.dart @@ -20,6 +20,25 @@ class ExpandableImage extends ConsumerWidget { builder: (_) => SafeArea( child: Stack( children: [ + Positioned.fill( + child: GestureDetector( + onTap: Navigator.of(context).pop, + child: InteractiveViewer( + maxScale: 10, + child: Image( + errorBuilder: (_, error, stackTrace) => ErrorDialog( + "Loading failed for $source\nError: $error", + stackTrace, + ), + image: CachedNetworkImage( + source!, + ref.watch(CrossCacheController.provider), + headers: ref.headers, + ), + ), + ), + ), + ), Align( alignment: .topRight, child: Padding( @@ -30,23 +49,6 @@ class ExpandableImage extends ConsumerWidget { ), ), ), - Center( - child: InteractiveViewer( - maxScale: 10, - child: Image( - fit: .contain, - errorBuilder: (_, error, stackTrace) => ErrorDialog( - "Loading failed for $source\nError: $error", - stackTrace, - ), - image: CachedNetworkImage( - source!, - ref.watch(CrossCacheController.provider), - headers: ref.headers, - ), - ), - ), - ), ], ), ),