import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; class ShowImageWidget extends StatelessWidget { final String imageUrl; final _transformationController = TransformationController(); late TapDownDetails _doubleTapDetails; ShowImageWidget(this.imageUrl, {super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( leading: GestureDetector( child: const Icon(Icons.close, color: Colors.white), onTap: () { Navigator.pop(context); }, ), backgroundColor: Colors.black, elevation: 0, ), body: Center( child: GestureDetector( onScaleUpdate: (ScaleUpdateDetails details) {}, onDoubleTap: _handleDoubleTap, onDoubleTapDown: _handleDoubleTapDown, child: InteractiveViewer( minScale: 0.5, maxScale: 20, panEnabled: false, transformationController: _transformationController, child: Container( height: MediaQuery.of(context).size.height, alignment: Alignment.center, child: CachedNetworkImage( imageUrl: imageUrl, fit: BoxFit.fill, ), ), ), ), ), ); } void _handleDoubleTapDown(TapDownDetails details) { _doubleTapDetails = details; } void _handleDoubleTap() { if (_transformationController.value != Matrix4.identity()) { _transformationController.value = Matrix4.identity(); } else { final position = _doubleTapDetails.localPosition; _transformationController.value = Matrix4.identity() ..translate(-position.dx * 2, -position.dy * 2) ..scale(4.0); } } }