import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:marking_app/utils/image/gallery_example_item.dart'; import 'package:marking_app/utils/image/gallery_example_item_model.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; class GalleryPhotoViewWrapper extends StatefulWidget { GalleryPhotoViewWrapper({ this.loadingBuilder, this.backgroundDecoration, this.minScale, this.maxScale, this.initialIndex = 0, required this.galleryItems, this.scrollDirection = Axis.horizontal, }) : pageController = PageController(initialPage: initialIndex); final LoadingBuilder? loadingBuilder; final BoxDecoration? backgroundDecoration; final dynamic minScale; final dynamic maxScale; final int initialIndex; final PageController pageController; final List galleryItems; final Axis scrollDirection; @override State createState() { return _GalleryPhotoViewWrapperState(); } } class _GalleryPhotoViewWrapperState extends State { late int currentIndex = widget.initialIndex; void onPageChanged(int index) { setState(() { currentIndex = index; }); } @override Widget build(BuildContext context) { return Scaffold( body: Container( decoration: widget.backgroundDecoration, constraints: BoxConstraints.expand( height: MediaQuery.of(context).size.height, ), child: Stack( alignment: Alignment.bottomRight, children: [ PhotoViewGallery.builder( scrollPhysics: const BouncingScrollPhysics(), builder: _buildItem, itemCount: widget.galleryItems.length, loadingBuilder: widget.loadingBuilder, backgroundDecoration: widget.backgroundDecoration, pageController: widget.pageController, onPageChanged: onPageChanged, scrollDirection: widget.scrollDirection, ), Container( padding: const EdgeInsets.all(20.0), child: Text( "整卷: ${currentIndex + 1}", style: const TextStyle( color: Colors.white, fontSize: 17.0, decoration: null, ), ), ), Positioned( left:0, top: 20.h, child: InkWell( onTap: (){ Navigator.pop(context); }, child: Icon(Icons.chevron_left,size: 40.sp,color: Colors.white), ) ) ], ), ), ); } PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) { final GalleryExampleItemModel item = widget.galleryItems[index]; return item.isSvg ? PhotoViewGalleryPageOptions.customChild( child: Container( width: 300, height: 300, child: SvgPicture.network( item.resource, height: 200.0, ), ), childSize: const Size(300, 300), initialScale: PhotoViewComputedScale.contained, minScale: PhotoViewComputedScale.contained * (0.5 + index / 10), maxScale: PhotoViewComputedScale.covered * 4.1, heroAttributes: PhotoViewHeroAttributes(tag: item.id), ) : PhotoViewGalleryPageOptions( imageProvider: NetworkImage(item.resource), initialScale: PhotoViewComputedScale.contained, minScale: PhotoViewComputedScale.contained * (0.5 + index / 10), maxScale: PhotoViewComputedScale.covered * 4.1, heroAttributes: PhotoViewHeroAttributes(tag: item.id), ); } }