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

  1. Null-check the view before calling GetFreeRenderer and skip iteration entries that are null.
  2. Ensure element lifecycle (cleanup of LogicalChildren) completes before invoking renderer pooling.
  3. 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

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.