From 488a83f74f38e1c36581c69490e84984217ff94b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 19 Jul 2026 09:33:46 +0300 Subject: [PATCH] FullScreen Image Viewer added. --- lib/extensions/context_extension.dart | 14 ++++++++++++- lib/extensions/widget_extensions.dart | 3 ++- lib/views/full_screen_image_viewer.dart | 20 +++++++++++++++++++ .../equipment/asset_image_upload_page.dart | 15 +++----------- 4 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 lib/views/full_screen_image_viewer.dart diff --git a/lib/extensions/context_extension.dart b/lib/extensions/context_extension.dart index 41f93d7f..a33130cb 100644 --- a/lib/extensions/context_extension.dart +++ b/lib/extensions/context_extension.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; import 'package:provider/provider.dart'; @@ -5,6 +6,7 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/swipe_module/dialoge/confirm_dialog.dart'; import 'package:test_sa/new_views/swipe_module/dialoge/info_dialog.dart'; +import 'package:test_sa/views/full_screen_image_viewer.dart'; import '../controllers/providers/settings/setting_provider.dart'; import '../l10n/app_localizations.dart'; @@ -24,6 +26,15 @@ extension BuildContextExtension on BuildContext { UserProvider get userProvider => Provider.of(this, listen: false); + void fullScreenImageViewer(Widget child) { + Navigator.of(this).push( + CupertinoPageRoute( + fullscreenDialog: true, + builder: (_) => FullScreenImageViewer(child), + ), + ); + } + bool isTablet() { final mediaQueryData = MediaQuery.of(this); final double screenWidth = mediaQueryData.size.width; @@ -49,6 +60,7 @@ extension BuildContextExtension on BuildContext { isScrollControlled: true, isDismissible: true, backgroundColor: Colors.transparent, - builder: (context) => SingleChildScrollView(padding: const EdgeInsets.all(0), child: childWidget.bottomSafeArea).bottomSheetContainerNew(context, title: title,showCancelButton: showCancelButton), + builder: (context) => + SingleChildScrollView(padding: const EdgeInsets.all(0), child: childWidget.bottomSafeArea).bottomSheetContainerNew(context, title: title, showCancelButton: showCancelButton), ); } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 252971f7..2e52b835 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -120,12 +120,13 @@ extension WidgetExtensions on Widget { double padding = 12, EdgeInsets? paddingObject, EdgeInsets? margin, + double? width, }) => withShadow ? Container( padding: paddingObject ?? EdgeInsets.all(padding), margin: margin, - width: double.infinity, + width: width ?? double.infinity, decoration: ShapeDecoration( color: backgroundColor ?? AppColor.background(context), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius), side: BorderSide(color: borderColor)), diff --git a/lib/views/full_screen_image_viewer.dart b/lib/views/full_screen_image_viewer.dart new file mode 100644 index 00000000..43aee198 --- /dev/null +++ b/lib/views/full_screen_image_viewer.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; + +class FullScreenImageViewer extends StatelessWidget { + final Widget child; + + const FullScreenImageViewer(this.child, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + InteractiveViewer(clipBehavior: Clip.none, panEnabled: true, minScale: 0.5, maxScale: 4.0, child: child).center, + Positioned(top: MediaQuery.of(context).padding.top, left: 12.0, child: const Icon(Icons.clear).toShadowContainer(context, width: 40, padding: 8).onPress(() => Navigator.maybePop(context))), + ], + ), + ); + } +} diff --git a/lib/views/widgets/equipment/asset_image_upload_page.dart b/lib/views/widgets/equipment/asset_image_upload_page.dart index 02c836d1..58e3a971 100644 --- a/lib/views/widgets/equipment/asset_image_upload_page.dart +++ b/lib/views/widgets/equipment/asset_image_upload_page.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; @@ -15,6 +16,7 @@ import 'package:test_sa/modules/cm_module/views/components/action_button/footer_ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/full_screen_image_viewer.dart'; import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; @@ -198,18 +200,7 @@ class _AssetImageUploadPageState extends State { Widget imageAngleCard(String icon, String title, GenericAttachmentModel? attachment) { if (attachment != null) { Widget imageWidget = _getImageWidget(attachment.name!); - return ClipRRect( - borderRadius: BorderRadius.circular(12), - child: imageWidget.onPress(() { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => Scaffold( - appBar: const DefaultAppBar(), - body: SafeArea(child: InteractiveViewer(child: imageWidget).center), - ), - ), - ); - })); + return ClipRRect(borderRadius: BorderRadius.circular(12), child: imageWidget.onPress(() => context.fullScreenImageViewer(imageWidget))); } return Column( mainAxisAlignment: MainAxisAlignment.center,