FormField

Provides consistent layout and interaction for form controls with label, description, and error handling. Perfect for Switch and Checkbox components when you want the entire field to be pressable.

Import

import { FormField } from 'heroui-native';

Anatomy

<FormField>
  <FormField.Label>...</FormField.Label>
  <FormField.Description>...</FormField.Description>
  <FormField.Indicator>...</FormField.Indicator>
  <FormField.ErrorMessage>...</FormField.ErrorMessage>
</FormField>
  • FormField: Root container that manages layout and state propagation
  • FormField.Label: Primary text label for the control
  • FormField.Description: Secondary descriptive helper text
  • FormField.Indicator: Container for the form control component (Switch, Checkbox)
  • FormField.ErrorMessage: Validation error message display

Usage

Basic Usage

FormField wraps form controls to provide consistent layout and state management.

<FormField isSelected={value} onSelectedChange={setValue}>
  <View className="flex-1">
    <FormField.Label>Label text</FormField.Label>
  </View>
  <FormField.Indicator />
</FormField>

With Description

Add helper text below the label using the Description component.

<FormField isSelected={value} onSelectedChange={setValue}>
  <View className="flex-1">
    <FormField.Label>Enable notifications</FormField.Label>
    <FormField.Description>
      Receive push notifications about your account activity
    </FormField.Description>
  </View>
  <FormField.Indicator />
</FormField>

With Error Message

Display validation errors using the ErrorMessage component.

<FormField
  isSelected={value}
  onSelectedChange={setValue}
  isInvalid={!value}
  className="flex-col items-start gap-1"
>
  <View className="flex-row items-center gap-2">
    <View className="flex-1">
      <FormField.Label>I agree to the terms</FormField.Label>
      <FormField.Description>
        By checking this box, you agree to our Terms of Service
      </FormField.Description>
    </View>
    <FormField.Indicator variant="checkbox" />
  </View>
  <FormField.ErrorMessage>This field is required</FormField.ErrorMessage>
</FormField>

Disabled State

Control interactivity with the disabled prop.

<FormField isSelected={value} onSelectedChange={setValue} isDisabled>
  <View className="flex-1">
    <FormField.Label>Disabled field</FormField.Label>
    <FormField.Description>This field is disabled</FormField.Description>
  </View>
  <FormField.Indicator />
</FormField>

Disabling All Animations

Disable all animations including children by using "disable-all". This cascades down to all child components.

<FormField
  isSelected={value}
  onSelectedChange={setValue}
  animation="disable-all"
>
  <View className="flex-1">
    <FormField.Label>Label text</FormField.Label>
    <FormField.Description>Description text</FormField.Description>
  </View>
  <FormField.Indicator />
</FormField>

Example

import { Checkbox, FormField, Switch } from 'heroui-native';
import React from 'react';
import { ScrollView, View } from 'react-native';

export default function FormFieldExample() {
  const [notifications, setNotifications] = React.useState(false);
  const [terms, setTerms] = React.useState(false);
  const [newsletter, setNewsletter] = React.useState(true);

  return (
    <ScrollView className="bg-background p-4">
      <View className="gap-4">
        <FormField
          isSelected={notifications}
          onSelectedChange={setNotifications}
        >
          <View className="flex-1">
            <FormField.Label>Enable notifications</FormField.Label>
            <FormField.Description>
              Receive push notifications about your account activity
            </FormField.Description>
          </View>
          <FormField.Indicator />
        </FormField>

        <FormField
          isSelected={terms}
          onSelectedChange={setTerms}
          isInvalid={!terms}
          className="flex-col items-start gap-1"
        >
          <View className="flex-row items-center gap-2">
            <View className="flex-1">
              <FormField.Label>
                I agree to the terms and conditions
              </FormField.Label>
              <FormField.Description>
                By checking this box, you agree to our Terms of Service
              </FormField.Description>
            </View>
            <FormField.Indicator className="mt-0.5">
              <Checkbox />
            </FormField.Indicator>
          </View>
          <FormField.ErrorMessage>
            This field is required
          </FormField.ErrorMessage>
        </FormField>

        <FormField isSelected={newsletter} onSelectedChange={setNewsletter}>
          <View className="flex-1">
            <FormField.Label>Subscribe to newsletter</FormField.Label>
          </View>
          <FormField.Indicator>
            <Checkbox color="warning" />
          </FormField.Indicator>
        </FormField>
      </View>
    </ScrollView>
  );
}

API Reference

FormField

proptypedefaultdescription
childrenReact.ReactNode | ((props: FormFieldRenderProps) => React.ReactNode)-Content to render inside the form control, or a render function
isSelectedbooleanundefinedWhether the control is selected/checked
isDisabledbooleanfalseWhether the form control is disabled
isInvalidbooleanfalseWhether the form control is invalid
classNamestring-Custom class name for the root element
onSelectedChange(isSelected: boolean) => void-Callback when selection state changes
animation"disable-all" | undefinedundefinedAnimation configuration. Use "disable-all" to disable all animations including children
...PressablePropsPressableProps-All React Native Pressable props are supported

FormField.Label

proptypedefaultdescription
childrenReact.ReactNode-Label text content
classNamestring-Custom class name for the label element
...TextPropsTextProps-All React Native Text props are supported

FormField.Description

proptypedefaultdescription
childrenReact.ReactNode-Description text content
classNamestring-Custom class name for the description element
...TextPropsTextProps-All React Native Text props are supported

FormField.Indicator

proptypedefaultdescription
childrenReact.ReactNode-Control component to render (Switch, Checkbox)
variant'checkbox' | 'switch''switch'Variant of the control to render when no children provided
classNamestring-Custom class name for the indicator element
...ViewPropsViewProps-All React Native View props are supported

Note: When children are provided, the component automatically passes down isSelected, onSelectedChange, isDisabled, and isInvalid props from the FormField context if they are not already present on the child component.

FormField.ErrorMessage

FormField.ErrorMessage extends all props from ErrorView component.

Note: The isInvalid prop is automatically passed from the FormField context. The error message visibility is controlled by the isInvalid state of the parent FormField.

Hooks

useFormField

Returns:

propertytypedescription
isSelectedboolean | undefinedWhether the control is selected/checked
onSelectedChange((isSelected: boolean) => void) | undefinedCallback when selection state changes
isDisabledbooleanWhether the form control is disabled
isInvalidbooleanWhether the form control is invalid
isPressedSharedValue<boolean>Reanimated shared value indicating press state

On this page