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
- Remove defaultValue from the alwaysOn filter input.
- Move the default to <List filterDefaultValues={{ q: 'foo' }}>.
- 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
- Never combine alwaysOn with defaultValue.
- Put defaults in <List filterDefaultValues>.
- Add a unit test scanning your filters array for the invalid combination.
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
- <InfiniteList> received a React element as `filter` props. I
- useListController received a React element as `filter` props
- useCanAccess must be used inside a <Resource> component or p
- useCreateController requires a non-empty resource prop or co
- useEditController requires a non-empty resource prop or cont
AI-assisted analysis of marmelab/react-admin@051f511bb0 (2026-08-30).
Data as JSON: /api/errors/4122d06bc90104bc.
Report an issue: GitHub.