{"record":{"id":"b981c79d159bda79","repo":"dotnet/maui","slug":"imageelementmanager-setimage-renderer-cannot-be-nu","errorCode":null,"errorMessage":"ImageElementManager.SetImage renderer cannot be null","messagePattern":"ImageElementManager\\.SetImage renderer cannot be null","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/iOS/Renderers/ImageElementManager.cs","lineNumber":147,"sourceCode":"\t\tpublic static void SetOpacity(IImageVisualElementRenderer renderer, IImageElement imageElement)\n\t\t{\n\t\t\tvar Element = renderer.Element;\n\t\t\tvar Control = renderer.GetImage();\n\n\t\t\tif (renderer.IsDisposed || Element == null || Control == null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n#if __MOBILE__\n\t\t\tControl.Opaque = imageElement.IsOpaque;\n#else\n\t\t\t(Control as FormsNSImageView)?.SetIsOpaque(imageElement.IsOpaque);\n#endif\n\t\t}\n\n\t\tpublic static async Task SetImage(IImageVisualElementRenderer renderer, IImageElement imageElement, Image oldElement = null)\n\t\t{\n\t\t\t_ = renderer ?? throw new ArgumentNullException(nameof(renderer), $\"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(renderer)} cannot be null\");\n\t\t\t_ = imageElement ?? throw new ArgumentNullException(nameof(imageElement), $\"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(imageElement)} cannot be null\");\n\n\t\t\tvar Element = renderer.Element;\n\t\t\tvar Control = renderer.GetImage();\n\n\t\t\tif (renderer.IsDisposed || Element == null || Control == null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar imageController = imageElement as IImageController;\n\n\t\t\tvar source = imageElement.Source;\n#if __MOBILE__\n\t\t\tif (Control.Image?.Images != null && Control.Image.Images.Length > 1)\n\t\t\t{\n\t\t\t\trenderer.SetImage(null);\n\t\t\t}","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/iOS/Renderers/ImageElementManager.cs#L129-L165","documentation":"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.","triggerScenarios":"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.","commonSituations":"Custom Image/ImageButton renderers; race conditions where the element is unloaded between the source-load kickoff and the SetImage call.","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."],"exampleFix":"// before\nawait ImageElementManager.SetImage(this.ImageVisualElementRenderer, Element);\n\n// after\nif (ImageVisualElementRenderer != null && !IsDisposed)\n    await ImageElementManager.SetImage(ImageVisualElementRenderer, Element);","handlingStrategy":"validation","validationCode":"if (renderer == null || renderer.IsDisposed) return;\nawait ImageElementManager.SetImage(renderer, imageElement);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Guard renderer disposal before async image loads.","Cancel image tasks on element unload."],"tags":["argumentnullexception","ios","image","async","renderer-disposal"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}