import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:dismissible_page/dismissible_page.dart'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/theme/app_decoration.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; import 'package:url_launcher/url_launcher.dart'; class PhotoViewScreen extends StatefulWidget { final List imageUrls; final int index; final bool isLocal; const PhotoViewScreen({ super.key, required this.imageUrls, required this.index, this.isLocal = false, }); @override State createState() => _PhotoViewScreenState(); } class _PhotoViewScreenState extends State { late final pageController; int imageIndex = 0; @override void initState() { imageIndex = widget.index; pageController = PageController(initialPage: imageIndex); super.initState(); } @override Widget build(BuildContext context) { return DismissiblePage( minScale: 1, onDismissed: () => GoRouter.of(context).pop(), direction: DismissiblePageDismissDirection.vertical, isFullScreen: true, child: PhotoViewGallery.builder( backgroundDecoration: BoxDecoration( color: Colors.transparent, ), scrollPhysics: const BouncingScrollPhysics(), builder: (BuildContext context, int index) { return PhotoViewGalleryPageOptions( imageProvider: widget.isLocal ? FileImage( File(widget.imageUrls[index]), ) as ImageProvider : CachedNetworkImageProvider( widget.imageUrls[index], ), initialScale: PhotoViewComputedScale.contained, minScale: PhotoViewComputedScale.contained, heroAttributes: PhotoViewHeroAttributes( tag: widget.imageUrls[index], transitionOnUserGestures: true, ), errorBuilder: (context, object, stackTrace) { return Scaffold( backgroundColor: Colors.black, body: SafeArea( child: Column( children: [ const SizedBox(height: 32), Text('Файл'), const SizedBox(height: 8), ListTile( shape: RoundedRectangleBorder( borderRadius: BorderRadiusStyle.circleBorder17, ), contentPadding: EdgeInsets.all(16), onTap: () async { if (!await launchUrl(Uri.parse(widget.imageUrls[index]))) { throw Exception('Could not launch ${widget.imageUrls[index]}'); } }, leading: Icon( Icons.file_copy_outlined, color: Colors.white, ), trailing: Icon( Icons.download_outlined, color: Colors.white, ), title: Text( widget.imageUrls[index].replaceAll(baseUrl + '/storage/' + 'chat_files/', ''), style: TextStyle( color: Colors.white, fontSize: 12, ), ), ), ], ), ), ); }, ); }, itemCount: widget.imageUrls.length, loadingBuilder: (context, event) => Center( child: Container( width: 20.0, height: 20.0, child: CircularProgressIndicator( value: event == null ? 0 : event.cumulativeBytesLoaded / event.expectedTotalBytes!, ), ), ), pageController: pageController, onPageChanged: (page) { setState(() { imageIndex = page; }); }, ), ); } }