diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/AvatarView/AvatarView.shared.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/AvatarView/AvatarView.shared.cs index d514868aa..f9fea7746 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/AvatarView/AvatarView.shared.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/AvatarView/AvatarView.shared.cs @@ -354,23 +354,17 @@ async void OnSourcePropertyChanged(bool isBindingContextChanged) try { - var imageStreamLoadingTask = GetImageStreamLoadingTask(source, imageLoadingTokenSource.Token); - if (imageStreamLoadingTask != null) + if (source is UriImageSource uriImageSource) { - using var stream = await imageStreamLoadingTask; - if (stream != null) - { - var newStream = new MemoryStream(); - stream.CopyTo(newStream); - newStream.Position = 0; - Image.IsVisible = true; - source = ImageSource.FromStream(() => newStream); - } - else - { - Image.IsVisible = false; - source = null; - } + static async Task getStreamAsync(UriImageSource uriSource, CancellationToken token) => uriSource.Uri != null ? await uriSource.GetStreamAsync(token) : null; + + var stream = await getStreamAsync(uriImageSource, imageLoadingTokenSource.Token); + + source = stream != null + ? ImageSource.FromStream(async (token) => stream?.CanRead ?? true ? stream : (stream = await getStreamAsync(uriImageSource, token))) + : null; + + Image.IsVisible = source != null; } else Image.IsVisible = await imageSourceValidator.IsImageSourceValidAsync(source); @@ -402,19 +396,5 @@ async void OnSourcePropertyChanged(bool isBindingContextChanged) return size * .4; } - - Task GetImageStreamLoadingTask(ImageSource? source, CancellationToken token) => source switch - { - IStreamImageSource streamImageSource => streamImageSource.GetStreamAsync(token), - UriImageSource uriImageSource => uriImageSource.Uri != null - ? new UriImageSource - { - Uri = uriImageSource.Uri, - CachingEnabled = uriImageSource.CachingEnabled, - CacheValidity = uriImageSource.CacheValidity - }.GetStreamAsync(token) - : Task.FromResult(null), - _ => Task.FromResult(null) - }; } } \ No newline at end of file