2024-03-26 15:30:43 +08:00
|
|
|
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';
|
2024-03-26 17:03:27 +08:00
|
|
|
import 'package:sk_base_mobile/app_theme.dart';
|
2024-03-26 15:30:43 +08:00
|
|
|
import 'package:sk_base_mobile/config.dart';
|
|
|
|
import 'package:sk_base_mobile/models/file.model.dart';
|
2024-03-26 17:03:27 +08:00
|
|
|
import 'package:sk_base_mobile/util/loading_util.dart';
|
|
|
|
import 'package:sk_base_mobile/util/media_util.dart';
|
2024-03-26 15:30:43 +08:00
|
|
|
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
2024-03-26 17:03:27 +08:00
|
|
|
import 'package:sk_base_mobile/util/snack_bar.util.dart';
|
2024-03-26 15:30:43 +08:00
|
|
|
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<FileModel> galleryItems;
|
|
|
|
final Axis scrollDirection;
|
|
|
|
@override
|
|
|
|
State<ImagePreivew> createState() => _ImagePreivewState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _ImagePreivewState extends State<ImagePreivew> {
|
|
|
|
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: <Widget>[
|
|
|
|
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),
|
|
|
|
),
|
|
|
|
),
|
2024-03-26 17:03:27 +08:00
|
|
|
),
|
|
|
|
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),
|
|
|
|
),
|
|
|
|
))
|
2024-03-26 15:30:43 +08:00
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|