You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
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);
|
|
}
|
|
}
|
|
}
|