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
- Construct VisualElementPackager inside the renderer constructor body where 'this' is non-null.
- Ensure the renderer implements IVisualElementRenderer fully before creating the packager.
- 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
- Instantiate VisualElementPackager in the renderer constructor body, not in a field initializer.
- Ensure 'this' is a valid IVisualElementRenderer before creating the packager.
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.