dotnet/maui · error · ArgumentNullException

renderer

Error message

renderer

What it means

VisualElementPackager manages adding/removing a VisualElement's children as native subviews. Its private constructor requires a non-null renderer (it stores Renderer and subscribes to ElementChanged, line 37-38, and reads renderer.Element at line 39). The public constructor delegates to it, so any VisualElementPackager construction needs a valid renderer.

Source

Thrown at src/Compatibility/Core/src/iOS/VisualElementPackager.cs:29

#endif
{
	[Obsolete]
	public class VisualElementPackager : IDisposable
	{
		VisualElement _element;

		bool _isDisposed;

		IElementController ElementController => _element;

		public VisualElementPackager(IVisualElementRenderer renderer) : this(renderer, null)
		{
		}

		VisualElementPackager(IVisualElementRenderer renderer, VisualElement element, bool isHeadless = false)
		{
			if (renderer == null)
				throw new ArgumentNullException(nameof(renderer));

			Renderer = renderer;
			if (!isHeadless)
				renderer.ElementChanged += OnRendererElementChanged;

			SetElement(null, element ?? renderer.Element);
		}

		protected IVisualElementRenderer Renderer { get; set; }

		public void Dispose()
		{
			Dispose(true);
		}

		public void Load()
		{
			for (var i = 0; i < ElementController.LogicalChildren.Count; i++)

View on GitHub (pinned to f377ff1c5e)

Solutions

  1. Construct VisualElementPackager inside the renderer constructor body where 'this' is non-null.
  2. Ensure the renderer implements IVisualElementRenderer fully before creating the packager.
  3. Pass the element explicitly if the renderer's Element might differ: new VisualElementPackager(this, element).

Example fix

// before
VisualElementPackager _packager = new VisualElementPackager(this);

// after
VisualElementPackager _packager;
public MyLayoutRenderer() { _packager = new VisualElementPackager(this); }
Defensive patterns

Strategy: validation

Validate before calling

if (renderer == null) throw new ArgumentNullException(nameof(renderer));
var packager = new VisualElementPackager(renderer);

Prevention

When it happens

Trigger: Calling new VisualElementPackager(null) - occurs in custom layout renderers that create the packager before assigning 'this', or that pass a null renderer reference from a failed lookup.

Common situations: Custom layout renderers (LayoutRenderer subclasses) initialising the packager in a field initializer; renderer created via factory that returned null being forwarded.

Related errors


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