diff --git a/analysis_options.yaml b/analysis_options.yaml index 111eb649..0e949f90 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,7 +7,6 @@ linter: - always_put_control_body_on_new_line - always_require_non_null_named_parameters - annotate_overrides - - avoid_as - avoid_classes_with_only_static_members - avoid_empty_else - avoid_field_initializers_in_const_classes diff --git a/example/pubspec.lock b/example/pubspec.lock index a372ba97..f2baa362 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.7.0" + version: "2.8.1" boolean_selector: dependency: transitive description: diff --git a/lib/src/core/photo_view_core.dart b/lib/src/core/photo_view_core.dart index c3e959e5..74595dfb 100644 --- a/lib/src/core/photo_view_core.dart +++ b/lib/src/core/photo_view_core.dart @@ -1,5 +1,4 @@ import 'package:flutter/widgets.dart'; - import 'package:photo_view/photo_view.dart' show PhotoViewScaleState, @@ -11,9 +10,9 @@ import 'package:photo_view/photo_view.dart' import 'package:photo_view/src/controller/photo_view_controller.dart'; import 'package:photo_view/src/controller/photo_view_controller_delegate.dart'; import 'package:photo_view/src/controller/photo_view_scalestate_controller.dart'; -import 'package:photo_view/src/utils/photo_view_utils.dart'; import 'package:photo_view/src/core/photo_view_gesture_detector.dart'; import 'package:photo_view/src/core/photo_view_hit_corners.dart'; +import 'package:photo_view/src/utils/photo_view_utils.dart'; const _defaultDecoration = const BoxDecoration( color: const Color.fromRGBO(0, 0, 0, 1.0), diff --git a/lib/src/photo_view_wrappers.dart b/lib/src/photo_view_wrappers.dart index 9cd8ac0a..f4ba10e6 100644 --- a/lib/src/photo_view_wrappers.dart +++ b/lib/src/photo_view_wrappers.dart @@ -66,15 +66,35 @@ class ImageWrapper extends StatefulWidget { class _ImageWrapperState extends State { ImageStreamListener? _imageStreamListener; ImageStream? _imageStream; - ImageChunkEvent? _imageChunkEvent; + ImageChunkEvent? _loadingProgress; ImageInfo? _imageInfo; bool _loading = true; Size? _imageSize; Object? _lastException; - StackTrace? _stackTrace; + StackTrace? _lastStack; + + @override + void dispose() { + super.dispose(); + _stopImageStream(); + } + + @override + void didChangeDependencies() { + _resolveImage(); + super.didChangeDependencies(); + } + + @override + void didUpdateWidget(ImageWrapper oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.imageProvider != oldWidget.imageProvider) { + _resolveImage(); + } + } // retrieve image from the provider - void _getImage() { + void _resolveImage() { final ImageStream newStream = widget.imageProvider.resolve( const ImageConfiguration(), ); @@ -83,8 +103,10 @@ class _ImageWrapperState extends State { ImageStreamListener _getOrCreateListener() { void handleImageChunk(ImageChunkEvent event) { - assert(widget.loadingBuilder != null); - setState(() => _imageChunkEvent = event); + setState(() { + _loadingProgress = event; + _lastException = null; + }); } void handleImageFrame(ImageInfo info, bool synchronousCall) { @@ -96,9 +118,9 @@ class _ImageWrapperState extends State { _loading = false; _imageInfo = _imageInfo; - _imageChunkEvent = null; + _loadingProgress = null; _lastException = null; - _stackTrace = null; + _lastStack = null; }; synchronousCall ? setupCB() : setState(setupCB); } @@ -107,8 +129,12 @@ class _ImageWrapperState extends State { setState(() { _loading = false; _lastException = error; - _stackTrace = stackTrace; + _lastStack = stackTrace; }); + assert(() { + if (widget.errorBuilder == null) throw error; + return true; + }()); } _imageStreamListener = ImageStreamListener( @@ -133,26 +159,6 @@ class _ImageWrapperState extends State { _imageStream?.removeListener(_imageStreamListener!); } - @override - void didUpdateWidget(ImageWrapper oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.imageProvider != oldWidget.imageProvider) { - _getImage(); - } - } - - @override - void didChangeDependencies() { - _getImage(); - super.didChangeDependencies(); - } - - @override - void dispose() { - super.dispose(); - _stopImageStream(); - } - @override Widget build(BuildContext context) { if (_loading) { @@ -195,11 +201,11 @@ class _ImageWrapperState extends State { Widget _buildLoading(BuildContext context) { if (widget.loadingBuilder != null) { - return widget.loadingBuilder!(context, _imageChunkEvent); + return widget.loadingBuilder!(context, _loadingProgress); } return PhotoViewDefaultLoading( - event: _imageChunkEvent, + event: _loadingProgress, ); } @@ -207,7 +213,7 @@ class _ImageWrapperState extends State { BuildContext context, ) { if (widget.errorBuilder != null) { - return widget.errorBuilder!(context, _lastException!, _stackTrace); + return widget.errorBuilder!(context, _lastException!, _lastStack); } return PhotoViewDefaultError( decoration: widget.backgroundDecoration,