dotnet/maui · error · ArgumentNullException

ImageElementManager.SetImage renderer cannot be null

Error message

ImageElementManager.SetImage renderer cannot be null

What it means

ImageElementManager.SetImage is a static async helper that loads and assigns a native image onto an IImageElement's renderer. The renderer is used to reach Element, the native image control, and the IsDisposed flag (lines 153-155). The guard uses a descriptive message so failures are diagnosable; the method cannot proceed without a renderer because it dereferences renderer.Element and renderer.GetImage() immediately.

Source

Thrown at src/Compatibility/Core/src/iOS/Renderers/ImageElementManager.cs:147

		public static void SetOpacity(IImageVisualElementRenderer renderer, IImageElement imageElement)
		{
			var Element = renderer.Element;
			var Control = renderer.GetImage();

			if (renderer.IsDisposed || Element == null || Control == null)
			{
				return;
			}
#if __MOBILE__
			Control.Opaque = imageElement.IsOpaque;
#else
			(Control as FormsNSImageView)?.SetIsOpaque(imageElement.IsOpaque);
#endif
		}

		public static async Task SetImage(IImageVisualElementRenderer renderer, IImageElement imageElement, Image oldElement = null)
		{
			_ = renderer ?? throw new ArgumentNullException(nameof(renderer), $"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(renderer)} cannot be null");
			_ = imageElement ?? throw new ArgumentNullException(nameof(imageElement), $"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(imageElement)} cannot be null");

			var Element = renderer.Element;
			var Control = renderer.GetImage();

			if (renderer.IsDisposed || Element == null || Control == null)
			{
				return;
			}

			var imageController = imageElement as IImageController;

			var source = imageElement.Source;
#if __MOBILE__
			if (Control.Image?.Images != null && Control.Image.Images.Length > 1)
			{
				renderer.SetImage(null);
			}

View on GitHub (pinned to f377ff1c5e)

Solutions

  1. Cache the renderer reference and pass it non-null; null-check before invoking SetImage.
  2. Verify the renderer is not disposed (IsDisposed) before calling.
  3. Ensure the ImageElement is still alive (imageElement != null) and its source is set.

Example fix

// before
await ImageElementManager.SetImage(this.ImageVisualElementRenderer, Element);

// after
if (ImageVisualElementRenderer != null && !IsDisposed)
    await ImageElementManager.SetImage(ImageVisualElementRenderer, Element);
Defensive patterns

Strategy: validation

Validate before calling

if (renderer == null || renderer.IsDisposed) return;
await ImageElementManager.SetImage(renderer, imageElement);

Prevention

When it happens

Trigger: Calling ImageElementManager.SetImage(null, imageElement) - happens when a custom image renderer forwards to SetImage before its own renderer reference is assigned, or when a disposed/unset renderer is passed from a page that was torn down.

Common situations: Custom Image/ImageButton renderers; race conditions where the element is unloaded between the source-load kickoff and the SetImage call.

Related errors


AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13). Data as JSON: /api/errors/b981c79d159bda79. Report an issue: GitHub.