From d63fc2088f9da688bd7ee5dc8396fb2c385a5065 Mon Sep 17 00:00:00 2001 From: Luis Nachtigall <31982496+LeLunZ@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:49:29 +0200 Subject: [PATCH] refactor(mobile): cleanup image providers (#31824) * refactor(mobile): remove redundant cancellation checks in image providers * refactor(mobile): extract request helpers in full image providers (cherry picked from commit 795507cfec262f8a6a9bd3ddd6f5647781e605ca) --- .../widgets/images/local_image_provider.dart | 36 ++++++++---------- .../widgets/images/remote_image_provider.dart | 38 ++++++++----------- 2 files changed, 31 insertions(+), 43 deletions(-) diff --git a/mobile/lib/presentation/widgets/images/local_image_provider.dart b/mobile/lib/presentation/widgets/images/local_image_provider.dart index d5535ee74..4c051461e 100644 --- a/mobile/lib/presentation/widgets/images/local_image_provider.dart +++ b/mobile/lib/presentation/widgets/images/local_image_provider.dart @@ -152,13 +152,8 @@ class LocalFullImageProvider extends ImageProvider { } final loadOriginal = SettingsRepository.instance.appConfig.image.loadOriginal; - final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio; - var request = loader.request = LocalImageRequest( - localId: key.id, - size: _previewTarget(devicePixelRatio, !loadOriginal), - assetType: key.assetType, - ); - yield* loader.loadRequest(request, decode, isFinal: !loadOriginal); + final previewRequest = loader.request = _previewRequest(key, isFinal: !loadOriginal); + yield* loader.loadRequest(previewRequest, decode, isFinal: !loadOriginal); if (!loadOriginal) { return; @@ -168,9 +163,8 @@ class LocalFullImageProvider extends ImageProvider { return; } - request = loader.request = LocalImageRequest(localId: key.id, assetType: key.assetType, size: Size.zero); - - yield* loader.loadRequest(request, decode, isFinal: true); + final originalRequest = loader.request = _originalRequest(key); + yield* loader.loadRequest(originalRequest, decode, isFinal: true); } Stream _animatedCodec(ImageLoader loader, LocalFullImageProvider key, ImageDecoderCallback decode) async* { @@ -180,12 +174,7 @@ class LocalFullImageProvider extends ImageProvider { return; } - final devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio; - final previewRequest = loader.request = LocalImageRequest( - localId: key.id, - size: _previewTarget(devicePixelRatio, false), - assetType: key.assetType, - ); + final previewRequest = loader.request = _previewRequest(key, isFinal: false); yield* loader.loadRequest(previewRequest, decode, isFinal: false); if (loader.isCancelled) { @@ -193,11 +182,7 @@ class LocalFullImageProvider extends ImageProvider { } // always try original for animated, since previews don't support animation - final originalRequest = loader.request = LocalImageRequest( - localId: key.id, - size: Size.zero, - assetType: key.assetType, - ); + final originalRequest = loader.request = _originalRequest(key); final codec = await loader.loadCodecRequest(originalRequest, isFinal: true); if (codec == null) { if (loader.isCancelled) { @@ -208,6 +193,15 @@ class LocalFullImageProvider extends ImageProvider { yield codec; } + LocalImageRequest _previewRequest(LocalFullImageProvider key, {required bool isFinal}) => LocalImageRequest( + localId: key.id, + size: _previewTarget(PlatformDispatcher.instance.views.first.devicePixelRatio, isFinal), + assetType: key.assetType, + ); + + LocalImageRequest _originalRequest(LocalFullImageProvider key) => + LocalImageRequest(localId: key.id, size: Size.zero, assetType: key.assetType); + @override bool operator ==(Object other) { if (identical(this, other)) { diff --git a/mobile/lib/presentation/widgets/images/remote_image_provider.dart b/mobile/lib/presentation/widgets/images/remote_image_provider.dart index 36cb4fe6e..3159c7a16 100644 --- a/mobile/lib/presentation/widgets/images/remote_image_provider.dart +++ b/mobile/lib/presentation/widgets/images/remote_image_provider.dart @@ -132,14 +132,7 @@ class RemoteFullImageProvider extends ImageProvider { return; } - final previewRequest = loader.request = RemoteImageRequest( - uri: getThumbnailUrlForRemoteId( - key.assetId, - type: AssetMediaSize.preview, - thumbhash: key.thumbhash, - edited: key.edited, - ), - ); + final previewRequest = loader.request = _previewRequest(key); final loadOriginal = assetType == AssetType.image && SettingsRepository.instance.appConfig.image.loadOriginal; yield* loader.loadRequest(previewRequest, decode, isFinal: !loadOriginal); @@ -151,9 +144,7 @@ class RemoteFullImageProvider extends ImageProvider { return; } - final originalRequest = loader.request = RemoteImageRequest( - uri: getOriginalUrlForRemoteId(key.assetId, edited: key.edited), - ); + final originalRequest = loader.request = _originalRequest(key); yield* loader.loadRequest(originalRequest, decode, isFinal: true); } @@ -164,14 +155,7 @@ class RemoteFullImageProvider extends ImageProvider { return; } - final previewRequest = loader.request = RemoteImageRequest( - uri: getThumbnailUrlForRemoteId( - key.assetId, - type: AssetMediaSize.preview, - thumbhash: key.thumbhash, - edited: key.edited, - ), - ); + final previewRequest = loader.request = _previewRequest(key); yield* loader.loadRequest(previewRequest, decode, isFinal: false); if (loader.isCancelled) { @@ -179,9 +163,7 @@ class RemoteFullImageProvider extends ImageProvider { } // always try original for animated, since previews don't support animation - final originalRequest = loader.request = RemoteImageRequest( - uri: getOriginalUrlForRemoteId(key.assetId, edited: key.edited), - ); + final originalRequest = loader.request = _originalRequest(key); final codec = await loader.loadCodecRequest(originalRequest, isFinal: true); if (codec == null) { if (loader.isCancelled) { @@ -192,6 +174,18 @@ class RemoteFullImageProvider extends ImageProvider { yield codec; } + RemoteImageRequest _previewRequest(RemoteFullImageProvider key) => RemoteImageRequest( + uri: getThumbnailUrlForRemoteId( + key.assetId, + type: AssetMediaSize.preview, + thumbhash: key.thumbhash, + edited: key.edited, + ), + ); + + RemoteImageRequest _originalRequest(RemoteFullImageProvider key) => + RemoteImageRequest(uri: getOriginalUrlForRemoteId(key.assetId, edited: key.edited)); + @override bool operator ==(Object other) { if (identical(this, other)) {