marmelab/react-admin · error · Error

Cannot use alwaysOn and defaultValue on a filter input. Plea

Error message

Cannot use alwaysOn and defaultValue on a filter input. Please set the filterDefaultValues props on the <List> element instead.

What it means

A filter input marked alwaysOn renders permanently and is not toggleable, so a defaultValue on it would be ignored/conflict with form initialization. react-admin mandates defaults for alwaysOn filters be given via <List filterDefaultValues> instead, and throws during a useEffect scan of filter elements.

Source

Thrown at packages/ra-ui-materialui/src/list/filter/FilterForm.tsx:53

    );
};

export type FilterFormProps = FilterFormBaseProps;

export const FilterFormBase = (props: FilterFormBaseProps) => {
    const { filters } = props;
    const resource = useResourceContext(props);
    const {
        displayedFilters = {},
        filterValues,
        hideFilter,
    } = useListContext();

    useEffect(() => {
        if (!filters) return;
        filters.forEach((filter: React.ReactElement) => {
            if (filter.props.alwaysOn && filter.props.defaultValue) {
                throw new Error(
                    'Cannot use alwaysOn and defaultValue on a filter input. Please set the filterDefaultValues props on the <List> element instead.'
                );
            }
        });
    }, [filters]);

    const getShownFilters = () => {
        if (!filters) return [];
        const values = filterValues;
        return filters.filter(
            (filterElement): filterElement is React.ReactElement => {
                if (!React.isValidElement(filterElement)) {
                    return false;
                }

                const filterValue = get(values, filterElement.props.source);
                return (
                    filterElement.props.alwaysOn ||

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Remove defaultValue from the alwaysOn filter input.
  2. Move the default to <List filterDefaultValues={{ q: 'foo' }}>.
  3. Drop alwaysOn if the filter should be toggleable with its own default.

Example fix

// before
<List filters={[<TextInput source="q" alwaysOn defaultValue="foo" />]}>
// after
<List filters={[<TextInput source="q" alwaysOn />]} filterDefaultValues={{ q: 'foo' }}>
Defensive patterns

Strategy: validation

Validate before calling

const invalid = filters?.some(f => f.props?.alwaysOn && f.props?.defaultValue != null);
if (invalid) throw new Error('alwaysOn filter cannot have defaultValue; use List filterDefaultValues');

Type guard

const isValidFilter = (f: React.ReactElement) => !(f.props.alwaysOn === true && f.props.defaultValue !== undefined);

Try / catch

useEffect(() => { try { validateFilters(filters); } catch (e) { setError(e); } }, [filters]);

Prevention

When it happens

Trigger: Declaring a filter like <TextInput source="q" alwaysOn defaultValue="foo" /> in a List's filters array.

Common situations: Migrating filter props from toggled to alwaysOn filters, or copy-pasting filter elements that retain defaultValue.

Related errors


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