Skip to content

Commit f9f5574

Browse files
authored
Fix(#464) network image (#467)
1 parent 81fd66c commit f9f5574

4 files changed

Lines changed: 39 additions & 35 deletions

File tree

analysis_options.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ linter:
77
- always_put_control_body_on_new_line
88
- always_require_non_null_named_parameters
99
- annotate_overrides
10-
- avoid_as
1110
- avoid_classes_with_only_static_members
1211
- avoid_empty_else
1312
- avoid_field_initializers_in_const_classes

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ packages:
77
name: async
88
url: "https://pub.dartlang.org"
99
source: hosted
10-
version: "2.7.0"
10+
version: "2.8.1"
1111
boolean_selector:
1212
dependency: transitive
1313
description:

lib/src/core/photo_view_core.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/widgets.dart';
2-
32
import 'package:photo_view/photo_view.dart'
43
show
54
PhotoViewScaleState,
@@ -11,9 +10,9 @@ import 'package:photo_view/photo_view.dart'
1110
import 'package:photo_view/src/controller/photo_view_controller.dart';
1211
import 'package:photo_view/src/controller/photo_view_controller_delegate.dart';
1312
import 'package:photo_view/src/controller/photo_view_scalestate_controller.dart';
14-
import 'package:photo_view/src/utils/photo_view_utils.dart';
1513
import 'package:photo_view/src/core/photo_view_gesture_detector.dart';
1614
import 'package:photo_view/src/core/photo_view_hit_corners.dart';
15+
import 'package:photo_view/src/utils/photo_view_utils.dart';
1716

1817
const _defaultDecoration = const BoxDecoration(
1918
color: const Color.fromRGBO(0, 0, 0, 1.0),

lib/src/photo_view_wrappers.dart

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,35 @@ class ImageWrapper extends StatefulWidget {
6666
class _ImageWrapperState extends State<ImageWrapper> {
6767
ImageStreamListener? _imageStreamListener;
6868
ImageStream? _imageStream;
69-
ImageChunkEvent? _imageChunkEvent;
69+
ImageChunkEvent? _loadingProgress;
7070
ImageInfo? _imageInfo;
7171
bool _loading = true;
7272
Size? _imageSize;
7373
Object? _lastException;
74-
StackTrace? _stackTrace;
74+
StackTrace? _lastStack;
75+
76+
@override
77+
void dispose() {
78+
super.dispose();
79+
_stopImageStream();
80+
}
81+
82+
@override
83+
void didChangeDependencies() {
84+
_resolveImage();
85+
super.didChangeDependencies();
86+
}
87+
88+
@override
89+
void didUpdateWidget(ImageWrapper oldWidget) {
90+
super.didUpdateWidget(oldWidget);
91+
if (widget.imageProvider != oldWidget.imageProvider) {
92+
_resolveImage();
93+
}
94+
}
7595

7696
// retrieve image from the provider
77-
void _getImage() {
97+
void _resolveImage() {
7898
final ImageStream newStream = widget.imageProvider.resolve(
7999
const ImageConfiguration(),
80100
);
@@ -83,8 +103,10 @@ class _ImageWrapperState extends State<ImageWrapper> {
83103

84104
ImageStreamListener _getOrCreateListener() {
85105
void handleImageChunk(ImageChunkEvent event) {
86-
assert(widget.loadingBuilder != null);
87-
setState(() => _imageChunkEvent = event);
106+
setState(() {
107+
_loadingProgress = event;
108+
_lastException = null;
109+
});
88110
}
89111

90112
void handleImageFrame(ImageInfo info, bool synchronousCall) {
@@ -96,9 +118,9 @@ class _ImageWrapperState extends State<ImageWrapper> {
96118
_loading = false;
97119
_imageInfo = _imageInfo;
98120

99-
_imageChunkEvent = null;
121+
_loadingProgress = null;
100122
_lastException = null;
101-
_stackTrace = null;
123+
_lastStack = null;
102124
};
103125
synchronousCall ? setupCB() : setState(setupCB);
104126
}
@@ -107,8 +129,12 @@ class _ImageWrapperState extends State<ImageWrapper> {
107129
setState(() {
108130
_loading = false;
109131
_lastException = error;
110-
_stackTrace = stackTrace;
132+
_lastStack = stackTrace;
111133
});
134+
assert(() {
135+
if (widget.errorBuilder == null) throw error;
136+
return true;
137+
}());
112138
}
113139

114140
_imageStreamListener = ImageStreamListener(
@@ -133,26 +159,6 @@ class _ImageWrapperState extends State<ImageWrapper> {
133159
_imageStream?.removeListener(_imageStreamListener!);
134160
}
135161

136-
@override
137-
void didUpdateWidget(ImageWrapper oldWidget) {
138-
super.didUpdateWidget(oldWidget);
139-
if (widget.imageProvider != oldWidget.imageProvider) {
140-
_getImage();
141-
}
142-
}
143-
144-
@override
145-
void didChangeDependencies() {
146-
_getImage();
147-
super.didChangeDependencies();
148-
}
149-
150-
@override
151-
void dispose() {
152-
super.dispose();
153-
_stopImageStream();
154-
}
155-
156162
@override
157163
Widget build(BuildContext context) {
158164
if (_loading) {
@@ -195,19 +201,19 @@ class _ImageWrapperState extends State<ImageWrapper> {
195201

196202
Widget _buildLoading(BuildContext context) {
197203
if (widget.loadingBuilder != null) {
198-
return widget.loadingBuilder!(context, _imageChunkEvent);
204+
return widget.loadingBuilder!(context, _loadingProgress);
199205
}
200206

201207
return PhotoViewDefaultLoading(
202-
event: _imageChunkEvent,
208+
event: _loadingProgress,
203209
);
204210
}
205211

206212
Widget _buildError(
207213
BuildContext context,
208214
) {
209215
if (widget.errorBuilder != null) {
210-
return widget.errorBuilder!(context, _lastException!, _stackTrace);
216+
return widget.errorBuilder!(context, _lastException!, _lastStack);
211217
}
212218
return PhotoViewDefaultError(
213219
decoration: widget.backgroundDecoration,

0 commit comments

Comments
 (0)