Skip to content

Commit dca39be

Browse files
committed
feat:image preview add long press showBottomPane
1 parent 54eeb0b commit dca39be

File tree

1 file changed

+72
-35
lines changed

1 file changed

+72
-35
lines changed

lib/utils/image_preview.dart

Lines changed: 72 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import 'dart:math';
33

44
import 'package:extended_image/extended_image.dart';
55
import 'package:flutter/material.dart';
6+
import 'package:flutter/services.dart';
67
import 'package:flutter_picgo/utils/extended.dart';
8+
import 'package:toast/toast.dart';
79

810
class 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

Comments
 (0)