import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; import 'package:sk_base_mobile/app_theme.dart'; import 'package:sk_base_mobile/config.dart'; import 'package:sk_base_mobile/models/file.model.dart'; import 'package:sk_base_mobile/util/loading_util.dart'; import 'package:sk_base_mobile/util/media_util.dart'; import 'package:sk_base_mobile/util/screen_adaper_util.dart'; import 'package:sk_base_mobile/util/snack_bar.util.dart'; import 'package:sk_base_mobile/widgets/fade_in_cache_image.dart'; import 'package:sk_base_mobile/widgets/loading_indicator.dart'; class ImagePreivew extends StatefulWidget { ImagePreivew({ super.key, required this.galleryItems, this.backgroundDecoration, this.minScale, this.maxScale, this.initialIndex = 0, this.scrollDirection = Axis.horizontal, }) : pageController = PageController(initialPage: initialIndex); final BoxDecoration? backgroundDecoration; final dynamic minScale; final dynamic maxScale; final int initialIndex; final PageController pageController; final List galleryItems; final Axis scrollDirection; @override State createState() => _ImagePreivewState(); } class _ImagePreivewState extends State { late int currentIndex = widget.initialIndex; @override Widget build(BuildContext context) { return 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: (_, _1) => const LoadingIndicator(common: true), backgroundDecoration: widget.backgroundDecoration, pageController: widget.pageController, onPageChanged: onPageChanged, scrollDirection: widget.scrollDirection, ), Container( padding: const EdgeInsets.all(20.0), child: Text( "照片 ${currentIndex + 1}", style: TextStyle( decoration: TextDecoration.none, color: Colors.white, fontSize: ScreenAdaper.sp(20), ), ), ), Positioned( top: ScreenAdaper.height(10), right: ScreenAdaper.width(10), child: IconButton( onPressed: () async { try { LoadingUtil.to.show(); await MediaUtil().saveImageToPhotoLib( imgUrl: '${GloablConfig.OSS_URL}${widget.galleryItems[currentIndex].path}'); } catch (e) { } finally { LoadingUtil.to.dismiss(); SnackBarUtil().success('已保存到相册'); } }, icon: Icon( Icons.download_for_offline_sharp, color: AppTheme.nearlyWhite, size: ScreenAdaper.sp(50), ), )) ], ), ); } PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) { final FileModel item = widget.galleryItems[index]; return PhotoViewGalleryPageOptions( onTapUp: (_, _1, _2) { Get.back(); }, imageProvider: Image.network('${GloablConfig.OSS_URL}${item.path}').image, initialScale: PhotoViewComputedScale.contained, minScale: PhotoViewComputedScale.contained * (0.5 + index / 10), maxScale: PhotoViewComputedScale.covered * 4.1, heroAttributes: PhotoViewHeroAttributes(tag: '${item.id}'), ); // return item.isSvg // ? PhotoViewGalleryPageOptions.customChild( // child: Container( // width: 300, // height: 300, // child: SvgPicture.asset( // 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: AssetImage(item.resource), // initialScale: PhotoViewComputedScale.contained, // minScale: PhotoViewComputedScale.contained * (0.5 + index / 10), // maxScale: PhotoViewComputedScale.covered * 4.1, // heroAttributes: PhotoViewHeroAttributes(tag: item.id), // ); } void onPageChanged(int index) { setState(() { currentIndex = index; }); } }