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
- Cache the renderer reference and pass it non-null; null-check before invoking SetImage.
- Verify the renderer is not disposed (IsDisposed) before calling.
- 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
- Guard renderer disposal before async image loads.
- Cancel image tasks on element unload.
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.