Image not showing after disposing stream in Xamarin Forms

Viewed 53

I have an Image that is shown using ImageSource.FromStream method. For that I use Xamarin.MediaGallery plugin. Everything works fine and image is shown properly. The problem arises after I call stream's Close() or Dispose() method. We are required to dispose stream after use, but when I dispose the stream, Image is not shown. Am I required to Dispose this stream? Am I doing it correctly?

Note that Image is shown properly if I add 3000ms delay before disposing the stream.

Here's my XAML code

<Image Source="{Binding MyImageSource}" />

Here's my C# code in ViewModel

public ImageSource MyImageSource { get => myImageSource; set => SetProperty(ref myImageSource, value); }
ImageSource myImageSource;

public ICommand PickFiles => new Command(async () =>
{
    MediaPickResult results = await MediaGallery.PickAsync(5, MediaFileType.Image);
    IMediaFile[] selectedFiles = results?.Files?.ToArray();

    Stream stream = await selectedFiles[0].OpenReadAsync();
    MyImageSource = ImageSource.FromStream(() => stream);

    // Everything is working fine until I add this line to dispose the stream. The Image is not shown
    stream.Close();

    // OR, this doesn't work too
    MyImageSource = ImageSource.FromStream(() => 
    {
        Stream stream1 = stream;
        stream.Close();
        return stream1;
    });


    // It works as expected if I add a delay before disposing.
    await Task.Delay(3000);
    stream.Close();
}
0 Answers
Related