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.
 
 
 
 
 
 

118 lines
4.1 KiB

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:huixiang/utils/ImgCachePath.dart';
import 'package:network_to_file_image/network_to_file_image.dart';
import 'package:photo_view/photo_view.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:path/path.dart' as p;
class PhotoViewGalleryScreen extends StatefulWidget {
List? images=[];
int index=0;
String? heroTag;
PageController? controller;
PhotoViewGalleryScreen({Key? key, this.images, this.index = 0, this.controller, this.heroTag}) : super(key: key){
controller = PageController(initialPage: index);
}
@override
_PhotoViewGalleryScreenState createState() => _PhotoViewGalleryScreenState();
}
class _PhotoViewGalleryScreenState extends State<PhotoViewGalleryScreen> {
int currentIndex=0;
@override
void initState() {
// TODO: implement initState
super.initState();
currentIndex=widget.index;
}
File fileFromDocsDir(String filename) {
String pathName = p.join(ImgCachePath.instance.path, filename);
return File(pathName);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
Positioned(
top: 0,
left: 0,
bottom: 0,
right: 0,
child: GestureDetector(
onTap: (){
Navigator.of(context).pop();
},
child: Container(
color: Colors.black,
child: PhotoViewGallery.builder(
scrollPhysics: const BouncingScrollPhysics(),
builder: (BuildContext context, int index) {
return PhotoViewGalleryPageOptions(
imageProvider: NetworkToFileImage(
url: widget.images![index],
file: fileFromDocsDir(widget.images![index].toString()
.replaceAll("https://pos.upload.gznl.top/", "").replaceAll("/", "")),
debug: true,
),
//图片的缩放级别
maxScale: PhotoViewComputedScale.contained *2.5,
minScale: PhotoViewComputedScale.contained *1,
);
},
itemCount: widget.images?.length ?? 0,
loadingBuilder: (context, progress) => Center(
child: Container(
width: 20.0,
height: 20.0,
child: CircularProgressIndicator(
value: progress == null || (progress.expectedTotalBytes == null && progress.expectedTotalBytes! > 0)
? null
: progress.cumulativeBytesLoaded / progress.expectedTotalBytes!,
),
),
),
backgroundDecoration: null,
pageController: widget.controller,
enableRotation: false,
onPageChanged: (index){
setState(() {
currentIndex=index;
});
},
)
),
),
),
Positioned(//图片index显示
top: MediaQuery.of(context).padding.top+15,
width: MediaQuery.of(context).size.width,
child: Center(
child: Text(
"${currentIndex+1}/${widget.images?.length ?? 0}",
style: TextStyle(
color: Colors.white,
fontSize: 16,
),
),
),
),
Positioned(//右上角关闭按钮
right: 10,
top: MediaQuery.of(context).padding.top,
child: IconButton(
icon: Icon(Icons.close,size: 30,color: Colors.white,),
onPressed: (){
Navigator.of(context).pop();
},
),
),
],
),
);
}
}