From d670ed18af7093311076d9eed0748d4ca54d002f Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:38:20 -0400 Subject: [PATCH] fix disposal --- .../widgets/images/thumbnail.widget.dart | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/mobile/lib/presentation/widgets/images/thumbnail.widget.dart b/mobile/lib/presentation/widgets/images/thumbnail.widget.dart index eeb70393c7..1702d926f2 100644 --- a/mobile/lib/presentation/widgets/images/thumbnail.widget.dart +++ b/mobile/lib/presentation/widgets/images/thumbnail.widget.dart @@ -88,7 +88,6 @@ class Thumbnail extends StatefulWidget { } class _ThumbnailState extends State { - ui.Image? _thumbhashImage; ui.Image? _providerImage; ImageStream? _imageStream; ImageStreamListener? _imageStreamListener; @@ -104,10 +103,17 @@ class _ThumbnailState extends State { @override void didUpdateWidget(Thumbnail oldWidget) { super.didUpdateWidget(oldWidget); - if (oldWidget.imageProvider != widget.imageProvider || - (_providerImage == null && - (widget.thumbhashMode != ThumbhashMode.disabled && oldWidget.blurhash != widget.blurhash) || - (oldWidget.thumbhashMode == ThumbhashMode.disabled && widget.thumbhashMode != ThumbhashMode.disabled))) { + if (widget.imageProvider != oldWidget.imageProvider) { + return _loadImage(); + } + + if (_providerImage != null) { + return; + } + + if ((oldWidget.thumbhashMode == ThumbhashMode.disabled && widget.thumbhashMode != ThumbhashMode.disabled) || + (oldWidget.thumbhashMode == ThumbhashMode.only && widget.thumbhashMode != ThumbhashMode.only) || + (widget.thumbhashMode != ThumbhashMode.disabled && oldWidget.blurhash != widget.blurhash)) { _loadImage(); } } @@ -123,7 +129,7 @@ class _ThumbnailState extends State { if (widget.thumbhashMode != ThumbhashMode.only && widget.imageProvider != null) { _loadFromProvider(); } - + if (widget.thumbhashMode != ThumbhashMode.disabled && widget.blurhash != null) { _decodeThumbhash(); } @@ -138,7 +144,6 @@ class _ThumbnailState extends State { (ImageInfo imageInfo, bool synchronousCall) { if (!mounted) return; - _thumbhashImage?.dispose(); if (_providerImage != imageInfo.image) { setState(() { _providerImage = imageInfo.image; @@ -221,7 +226,7 @@ class _ThumbnailState extends State { ); return _ThumbnailLeaf( - image: _providerImage ?? _thumbhashImage, + image: _providerImage, fit: widget.fit, placeholderGradient: gradient, ); @@ -230,7 +235,7 @@ class _ThumbnailState extends State { @override void dispose() { _stopListeningToStream(); - _thumbhashImage?.dispose(); + _providerImage?.dispose(); super.dispose(); } } @@ -303,7 +308,7 @@ class _ThumbnailRenderBox extends RenderBox { markNeedsPaint(); }); } else { - // _previousImage?.dispose(); + _previousImage?.dispose(); _previousImage = null; _fadeStartTime = null; } @@ -348,7 +353,7 @@ class _ThumbnailRenderBox extends RenderBox { final time = DateTime.now(); if (time.difference(_lastImageRequest).inMilliseconds >= 16) { - _fadeStartTime = DateTime.now(); + _fadeStartTime = time; _previousImage = _image; } _image = value; @@ -377,4 +382,10 @@ class _ThumbnailRenderBox extends RenderBox { markNeedsPaint(); } } + + @override + dispose() { + _previousImage?.dispose(); + super.dispose(); + } }