stride3d/stride · error · ArgumentNullException

Value cannot be null. (Parameter 'factory')

Error message

Value cannot be null. (Parameter 'factory')

What it means

Argument-null validation in RendererManager.RegisterRendererFactory: the factory parameter is null. Registering a null factory would leave the type mapped to nothing and cause a null renderer during GetRenderer, so the registration is rejected with ArgumentNullException named 'factory'.

Solutions

  1. Pass a non-null IElementRendererFactory instance as the factory argument to RegisterRendererFactory.
  2. Construct or obtain the factory before registering it; if factory creation can fail, do not call RegisterRendererFactory at all.
  3. Guard the call site: skip or log when the factory reference is null instead of passing null into the registration API.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at sources/engine/Stride.UI/Renderers/RendererManager.cs:65 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/ec6183951cc44336. Report an issue: GitHub.

Appendix: source

Thrown at sources/engine/Stride.UI/Renderers/RendererManager.cs:65

                // try to get the renderer from the default renderer factory.
                if (elementRenderer == null && defaultFactory != null)
                    elementRenderer = defaultFactory.TryCreateRenderer(element);

                if (elementRenderer == null)
                    throw new InvalidOperationException($"No renderer found for element {element}");

                // cache the renderer for future uses.
                elementIdToRenderer[element.Id] = elementRenderer;
            }

            return elementRenderer;
        }

        public void RegisterRendererFactory(Type uiElementType, IElementRendererFactory factory)
        {
            if (uiElementType == null) throw new ArgumentNullException(nameof(uiElementType));
            if (factory == null) throw new ArgumentNullException(nameof(factory));

            if (!typeof(UIElement).GetTypeInfo().IsAssignableFrom(uiElementType.GetTypeInfo()))
                throw new InvalidOperationException(uiElementType + " is not a descendant of UIElement.");

            typesToUserFactories[uiElementType] = factory;
        }

        public void RegisterRenderer(UIElement element, ElementRenderer renderer)
        {
            if (element == null) throw new ArgumentNullException(nameof(element));
            if (renderer == null) throw new ArgumentNullException(nameof(renderer));

            elementIdToRenderer[element.Id] = renderer;
        }

        public void Dispose()
        {
            foreach (var renderer in elementIdToRenderer.Values)

View on GitHub (pinned to 96fad776d2)