Skip to content

Commit 10c3a4d

Browse files
authored
Allow swiping fullscreen images to exit view. (#242)
* Allow swiping fullscreen images to exit view. * Track scale in image and prevent swipe to exit when image is scaled. Double tap to reset image transform. * Animate double tap to reset image transform. * Add extended_image dependency and update AdvancedImage to use. * Add warning to log on image load failure.
1 parent 8bb83e6 commit 10c3a4d

File tree

3 files changed

+87
-35
lines changed

3 files changed

+87
-35
lines changed

lib/src/widgets/image.dart

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'dart:io';
22
import 'dart:math';
3-
43
import 'package:blurhash_ffi/blurhash_ffi.dart';
54
import 'package:flutter/material.dart';
5+
import 'package:interstellar/src/controller/controller.dart';
66
import 'package:interstellar/src/models/image.dart';
77
import 'package:interstellar/src/utils/share.dart';
88
import 'package:interstellar/src/utils/utils.dart';
@@ -11,6 +11,8 @@ import 'package:interstellar/src/widgets/loading_button.dart';
1111
import 'package:interstellar/src/widgets/wrapper.dart';
1212
import 'package:interstellar/src/widgets/super_hero.dart';
1313
import 'package:material_symbols_icons/symbols.dart';
14+
import 'package:extended_image/extended_image.dart';
15+
import 'package:provider/provider.dart';
1416

1517
class AdvancedImage extends StatelessWidget {
1618
final ImageModel image;
@@ -34,11 +36,11 @@ class AdvancedImage extends StatelessWidget {
3436
? null
3537
: sqrt(1080 / (image.blurHashWidth! * image.blurHashHeight!));
3638

37-
return SuperHero(
38-
tag: image.toString() + (hero ?? ''),
39-
child: Wrapper(
40-
shouldWrap: openTitle != null,
41-
parentBuilder: (child) => GestureDetector(
39+
return Wrapper(
40+
shouldWrap: openTitle != null,
41+
parentBuilder: (child) => SuperHero(
42+
tag: image.toString() + (hero ?? ''),
43+
child: GestureDetector(
4244
onTap: () => pushRoute(
4345
context,
4446
builder: (context) => AdvancedImagePage(
@@ -50,30 +52,51 @@ class AdvancedImage extends StatelessWidget {
5052
),
5153
child: child,
5254
),
53-
child: Wrapper(
54-
shouldWrap: enableBlur,
55-
parentBuilder: (child) => Blur(child),
56-
child: Stack(
57-
alignment: Alignment.center,
58-
fit: StackFit.passthrough,
59-
children: [
60-
if (image.blurHash != null)
61-
Image(
62-
fit: fit,
63-
image: BlurhashFfiImage(
64-
image.blurHash!,
65-
decodingWidth: (blurHashSizeFactor! * image.blurHashWidth!)
66-
.ceil(),
67-
decodingHeight: (blurHashSizeFactor * image.blurHashHeight!)
68-
.ceil(),
69-
scale: blurHashSizeFactor,
70-
),
71-
),
72-
Image.network(image.src, fit: fit),
73-
],
74-
),
55+
),
56+
child: Wrapper(
57+
shouldWrap: enableBlur,
58+
parentBuilder: (child) => Blur(child),
59+
child: Stack(
60+
alignment: Alignment.center,
61+
fit: StackFit.passthrough,
62+
children: [
63+
ExtendedImage.network(
64+
image.src,
65+
fit: fit,
66+
enableSlideOutPage: true,
67+
heroBuilderForSlidingPage: (child) {
68+
return SuperHero(
69+
tag: image.toString() + (hero ?? ''),
70+
child: child,
71+
);
72+
},
73+
cache: true,
74+
mode: ExtendedImageMode.gesture,
75+
loadStateChanged: (state) {
76+
if (state.extendedImageLoadState == LoadState.loading &&
77+
image.blurHash != null) {
78+
return ExtendedImage(
79+
fit: fit,
80+
image: BlurhashFfiImage(
81+
image.blurHash!,
82+
decodingWidth:
83+
(blurHashSizeFactor! * image.blurHashWidth!).ceil(),
84+
decodingHeight:
85+
(blurHashSizeFactor * image.blurHashHeight!).ceil(),
86+
scale: blurHashSizeFactor,
87+
),
88+
enableSlideOutPage: true,
89+
);
90+
} else if (state.extendedImageLoadState == LoadState.failed) {
91+
context.read<AppController>().logger.w('Image failed to load: ${image.src}');
92+
}
93+
return null;
94+
},
95+
),
96+
],
7597
),
7698
),
99+
// ),
77100
);
78101
}
79102
}
@@ -97,6 +120,11 @@ class AdvancedImagePage extends StatefulWidget {
97120
}
98121

99122
class _AdvancedImagePageState extends State<AdvancedImagePage> {
123+
@override
124+
void initState() {
125+
super.initState();
126+
}
127+
100128
@override
101129
Widget build(BuildContext context) {
102130
const shadows = <Shadow>[
@@ -136,14 +164,13 @@ class _AdvancedImagePageState extends State<AdvancedImagePage> {
136164
body: Stack(
137165
children: [
138166
Positioned.fill(
139-
child: InteractiveViewer(
167+
child: ExtendedImageSlidePage(
168+
slideAxis: SlideAxis.both,
140169
child: SafeArea(
141-
child: Center(
142-
child: AdvancedImage(
143-
widget.image,
144-
hero: widget.hero,
145-
fit: widget.fit,
146-
),
170+
child: AdvancedImage(
171+
widget.image,
172+
hero: widget.hero,
173+
// fit: widget.fit,
147174
),
148175
),
149176
),

pubspec.lock

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,22 @@ packages:
249249
url: "https://pub.dev"
250250
source: hosted
251251
version: "5.0.1"
252+
extended_image:
253+
dependency: "direct main"
254+
description:
255+
name: extended_image
256+
sha256: f6cbb1d798f51262ed1a3d93b4f1f2aa0d76128df39af18ecb77fa740f88b2e0
257+
url: "https://pub.dev"
258+
source: hosted
259+
version: "10.0.1"
260+
extended_image_library:
261+
dependency: transitive
262+
description:
263+
name: extended_image_library
264+
sha256: "1f9a24d3a00c2633891c6a7b5cab2807999eb2d5b597e5133b63f49d113811fe"
265+
url: "https://pub.dev"
266+
source: hosted
267+
version: "5.0.1"
252268
fake_async:
253269
dependency: transitive
254270
description:
@@ -501,6 +517,14 @@ packages:
501517
url: "https://pub.dev"
502518
source: hosted
503519
version: "1.4.0"
520+
http_client_helper:
521+
dependency: transitive
522+
description:
523+
name: http_client_helper
524+
sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1"
525+
url: "https://pub.dev"
526+
source: hosted
527+
version: "3.0.0"
504528
http_multi_server:
505529
dependency: transitive
506530
description:

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ dependencies:
5353
simplytranslate: ^2.2.2
5454
visibility_detector: ^0.4.0+2
5555
logger: ^2.6.1
56+
extended_image: ^10.0.1
5657

5758
dev_dependencies:
5859
flutter_lints: ^5.0.0

0 commit comments

Comments
 (0)