diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx
index 64da1a4c4a2..8ebeff9af4c 100644
--- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx
+++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx
@@ -7,7 +7,7 @@ import {
waitFor,
} from '@testing-library/react';
import expect from 'expect';
-import { testDataProvider } from 'ra-core';
+import { FormDataConsumer, testDataProvider } from 'ra-core';
import { AdminContext } from '../../AdminContext';
import { SimpleForm } from '../../form';
@@ -704,4 +704,42 @@ describe('', () => {
screen.queryAllByText('Custom Remove Button').length
).toBeGreaterThan(0);
});
+
+ it('should not add an empty property when using FormDataConsumer as child', async () => {
+ const save = jest.fn();
+ render(
+
+
+
+
+
+
+ {({ scopedFormData, getSource }) =>
+ scopedFormData && scopedFormData.name ? (
+ string)('role')}
+ />
+ ) : null
+ }
+
+
+
+
+
+ );
+
+ const addItemElement = screen
+ .getByText('ra.action.add')
+ .closest('button') as HTMLButtonElement;
+
+ fireEvent.click(addItemElement);
+ fireEvent.click(screen.getByText('ra.action.save'));
+ await waitFor(() => {
+ expect(save).toHaveBeenCalledWith({
+ emails: [{ email: '' }],
+ });
+ });
+ });
});
diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx
index f0872cb6558..4a778973952 100644
--- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx
+++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx
@@ -13,7 +13,7 @@ import { styled } from '@mui/material';
import clsx from 'clsx';
import get from 'lodash/get';
import PropTypes from 'prop-types';
-import { RaRecord, useRecordContext } from 'ra-core';
+import { FormDataConsumer, RaRecord, useRecordContext } from 'ra-core';
import { UseFieldArrayReturn } from 'react-hook-form';
import { useArrayInput } from './useArrayInput';
@@ -61,7 +61,10 @@ export const SimpleFormIterator = (props: SimpleFormIteratorProps) => {
if (item == null) {
defaultValue = {} as Record;
Children.forEach(children, input => {
- if (React.isValidElement(input)) {
+ if (
+ React.isValidElement(input) &&
+ input.type !== FormDataConsumer
+ ) {
defaultValue[input.props.source] =
input.props.defaultValue ?? '';
}