@@ -66,15 +66,35 @@ class ImageWrapper extends StatefulWidget {
6666class _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