@@ -3,7 +3,9 @@ import 'dart:math';
33
44import 'package:extended_image/extended_image.dart' ;
55import 'package:flutter/material.dart' ;
6+ import 'package:flutter/services.dart' ;
67import 'package:flutter_picgo/utils/extended.dart' ;
8+ import 'package:toast/toast.dart' ;
79
810class ImagePreviewUtils {
911 /// 打开图片预览页面
@@ -82,48 +84,83 @@ class _GalleryPhotoViewWrapperState extends State<GalleryPhotoViewWrapper> {
8284 pageSize: pageSize,
8385 color: Colors .black,
8486 pageGestureAxis: SlideAxis .both),
85- child: ExtendedImageGesturePageView .builder (
86- itemBuilder: (BuildContext context, int index) {
87- var item = widget.galleryItems[index];
88- Widget image = item.resource.startsWith ('http' )
89- ? ExtendedImage .network (
90- item.resource,
91- fit: BoxFit .contain,
92- cache: true ,
93- mode: ExtendedImageMode .gesture,
94- enableSlideOutPage: true ,
95- loadStateChanged: (state) =>
96- defaultLoadStateChanged (state, iconSize: 50 ),
97- )
98- : ExtendedImage .file (
99- File (item.resource),
100- fit: BoxFit .contain,
101- mode: ExtendedImageMode .gesture,
102- enableSlideOutPage: true ,
103- loadStateChanged: (state) =>
104- defaultLoadStateChanged (state, iconSize: 50 ),
105- );
106- image = Container (
107- child: image,
108- );
109- if (index == currentIndex) {
110- return Hero (
111- tag: index,
87+ child: GestureDetector (
88+ child: ExtendedImageGesturePageView .builder (
89+ itemBuilder: (BuildContext context, int index) {
90+ var item = widget.galleryItems[index];
91+ Widget image = item.resource.startsWith ('http' )
92+ ? ExtendedImage .network (
93+ item.resource,
94+ fit: BoxFit .contain,
95+ cache: true ,
96+ mode: ExtendedImageMode .gesture,
97+ enableSlideOutPage: true ,
98+ loadStateChanged: (state) =>
99+ defaultLoadStateChanged (state, iconSize: 50 ),
100+ )
101+ : ExtendedImage .file (
102+ File (item.resource),
103+ fit: BoxFit .contain,
104+ mode: ExtendedImageMode .gesture,
105+ enableSlideOutPage: true ,
106+ loadStateChanged: (state) =>
107+ defaultLoadStateChanged (state, iconSize: 50 ),
108+ );
109+ image = Container (
112110 child: image,
113111 );
114- } else {
115- return image;
116- }
117- },
118- itemCount: widget.galleryItems.length,
119- controller: PageController (
120- initialPage: currentIndex,
112+ if (index == currentIndex) {
113+ return Hero (
114+ tag: index,
115+ child: image,
116+ );
117+ } else {
118+ return image;
119+ }
120+ },
121+ itemCount: widget.galleryItems.length,
122+ controller: PageController (
123+ initialPage: currentIndex,
124+ ),
125+ scrollDirection: Axis .horizontal,
121126 ),
122- scrollDirection: Axis .horizontal,
127+ onLongPress: () {
128+ _showBottomPane ();
129+ },
123130 ),
124131 );
125132 }
126133
134+ /// 底部弹窗
135+ _showBottomPane () {
136+ showModalBottomSheet (
137+ context: context,
138+ builder: (context) {
139+ return SafeArea (
140+ child: Container (
141+ child: Column (
142+ mainAxisSize: MainAxisSize .min,
143+ children: [
144+ ListTile (
145+ title: Text ('复制链接' ),
146+ onTap: () {
147+ _handleCopy (context);
148+ },
149+ ),
150+ ],
151+ ),
152+ ));
153+ });
154+ }
155+
156+ /// 复制链接
157+ _handleCopy (BuildContext context) {
158+ Clipboard .setData (
159+ ClipboardData (text: widget.galleryItems[currentIndex].resource));
160+ Toast .show ('已复制到剪切板' , context);
161+ Navigator .pop (context);
162+ }
163+
127164 Color defaultSlidePageBackgroundHandler (
128165 {Offset offset, Size pageSize, Color color, SlideAxis pageGestureAxis}) {
129166 double opacity = 0.0 ;
0 commit comments