dotnet/maui · error · ArgumentNullException
view
Error message
view
What it means
GetFreeRenderer(VisualElement view) returns a recycled renderer of the correct type for a given view, falling back to ViewRenderer when no handler is registered (line 38). A null view cannot be looked up in the registrar and cannot be passed to renderer.SetElement (line 45), so the method rejects null up front.
Source
Thrown at src/Compatibility/Core/src/iOS/RendererPool.cs:36
readonly IVisualElementRenderer _parent;
public RendererPool(IVisualElementRenderer renderer, VisualElement oldElement)
{
if (renderer == null)
throw new ArgumentNullException("renderer");
if (oldElement == null)
throw new ArgumentNullException("oldElement");
_oldElement = oldElement;
_parent = renderer;
}
public IVisualElementRenderer GetFreeRenderer(VisualElement view)
{
if (view == null)
throw new ArgumentNullException("view");
var rendererType = Controls.Internals.Registrar.Registered.GetHandlerTypeForObject(view) ?? typeof(ViewRenderer);
Stack<IVisualElementRenderer> renderers;
if (!_freeRenderers.TryGetValue(rendererType, out renderers) || renderers.Count == 0)
return null;
var renderer = renderers.Pop();
renderer.SetElement(view);
return renderer;
}
public void UpdateNewElement(VisualElement newElement)
{
if (newElement == null)
throw new ArgumentNullException("newElement");
var sameChildrenTypes = true;View on GitHub (pinned to f377ff1c5e)
Solutions
- Null-check the view before calling GetFreeRenderer and skip iteration entries that are null.
- Ensure element lifecycle (cleanup of LogicalChildren) completes before invoking renderer pooling.
- Prefer Registrar.Registered.GetHandlerTypeForObject on a known non-null element.
Example fix
// before var r = pool.GetFreeRenderer(child); // after if (child == null) continue; var r = pool.GetFreeRenderer(child);
Defensive patterns
Strategy: validation
Validate before calling
if (view == null) return null; // or continue in a loop var renderer = pool.GetFreeRenderer(view);
Prevention
- Filter nulls out of child collections before pooling.
- Avoid mutating LogicalChildren while iterating.
When it happens
Trigger: Calling pool.GetFreeRenderer(null), or passing a view reference that was set to null by an element-detach/teardown race before the pool is queried for a free renderer.
Common situations: Custom layout renderers that iterate children while the logical-children collection is being mutated; collection-changed handlers firing during disposal.
Related errors
AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13).
Data as JSON: /api/errors/833521bf757aac06.
Report an issue: GitHub.