marmelab/react-admin · error · Error

If you're not wrapping the RadioButtonGroupInput inside a…

Error message

If you're not wrapping the RadioButtonGroupInput inside a ReferenceArrayInput, you must provide the choices prop

What it means

RadioButtonGroupInput needs choices to render its radio options. If the component is not pending and there is no fetch error but the resolved choices (props or reference context) are still undefined, it throws instead of rendering nothing, to surface the misconfiguration explicitly.

Solutions

  1. Pass a choices array: <RadioButtonGroupInput source="gender" choices={[{id:'m',name:'Male'}]} />
  2. Use a ReferenceInput so choices are loaded from the referenced resource
  3. Default computed choices to [] to guarantee a defined array

Example fix

// before
<RadioButtonGroupInput source="gender" choices={maybeChoices} />
// after
<RadioButtonGroupInput source="gender" choices={maybeChoices ?? []} />
Defensive patterns

Strategy: validation

Validate before calling

if (!isPending && !fetchError && !Array.isArray(allChoices)) {
  throw new Error('RadioButtonGroupInput requires a defined choices array');
}

Type guard

const hasChoices = (
  p: RadioButtonGroupInputProps
): p is RadioButtonGroupInputProps & { choices: any[] } =>
  Array.isArray(p.choices);

Try / catch

try {
  render(<RadioButtonGroupInput source="gender" choices={maybeChoices} />);
} catch (e) {
  if (e.message.includes('must provide the choices prop')) {
    render(<RadioButtonGroupInput source="gender" choices={[]} />);
  }
}

Prevention

When it happens

Trigger: Standalone RadioButtonGroupInput with source but no choices prop; or a ReferenceInput parent whose resolved choices are undefined once loading finished without an error state.

Common situations: Forgetting the choices prop on a standalone input, custom data loading returning undefined instead of [], or a reference query resolving with undefined data while isPending is false.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of marmelab/react-admin@051f511bb0 (2026-08-30). Data as JSON: /api/errors/b847145e982f5b5f. Report an issue: GitHub.

Appendix: source

Thrown at packages/ra-ui-materialui/src/input/RadioButtonGroupInput.tsx:164

        source,
        isFromReference,
    } = useChoicesContext({
        choices: choicesProp,
        isFetching: isFetchingProp,
        isLoading: isLoadingProp,
        isPending: isPendingProp,
        resource: resourceProp,
        source: sourceProp,
    });

    if (source === undefined) {
        throw new Error(
            `If you're not wrapping the RadioButtonGroupInput inside a ReferenceArrayInput, you must provide the source prop`
        );
    }

    if (!isPending && !fetchError && allChoices === undefined) {
        throw new Error(
            `If you're not wrapping the RadioButtonGroupInput inside a ReferenceArrayInput, you must provide the choices prop`
        );
    }

    const { id, isRequired, fieldState, field } = useInput({
        format,
        onBlur,
        onChange,
        parse,
        resource,
        source,
        validate,
        disabled,
        readOnly,
        ...rest,
    });

    const getRecordRepresentation = useGetRecordRepresentation(resource);

View on GitHub (pinned to 051f511bb0)