Expo UI and Router for iOS
Components

SecureField

A SwiftUI SecureField component for password input.

Expo UI SecureField matches the official SwiftUI SecureField API and provides a text field that masks user input for passwords and other sensitive text.

Usage

Basic secure field

import { useState } from 'react';
import { Host, SecureField } from '@expo/ui/swift-ui';

export default function BasicSecureFieldExample() {
  const [password, setPassword] = useState('');

  // A secure field stretches to the width it is given, so give the host a size.
  return (
    <Host style={{ flex: 1 }}>
      <SecureField
        placeholder="Password"
        onTextChange={setPassword}
      />
    </Host>
  );
}

Submit handling

Use the submitLabel and onSubmit modifiers to handle form submission from the keyboard.

import { useState } from 'react';
import { Host, SecureField } from '@expo/ui/swift-ui';
import { submitLabel, onSubmit } from '@expo/ui/swift-ui/modifiers';

export default function SecureFieldSubmitExample() {
  const [password, setPassword] = useState('');

  return (
    <Host style={{ flex: 1 }}>
      <SecureField
        placeholder="Password"
        onTextChange={setPassword}
        modifiers={[
          submitLabel('done'),
          onSubmit(() => console.log('Login submitted')),
        ]}
      />
    </Host>
  );
}

Imperative ref

Use a ref to imperatively set text, focus, or blur the secure field.

import { useRef } from 'react';
import {
  Host,
  SecureField,
  SecureFieldRef,
  Button,
  HStack,
  VStack,
} from '@expo/ui/swift-ui';
import { buttonStyle } from '@expo/ui/swift-ui/modifiers';

export default function ImperativeSecureFieldExample() {
  const ref = useRef<SecureFieldRef>(null);

  return (
    <Host style={{ flex: 1 }}>
      <VStack>
        <SecureField ref={ref} placeholder="Password" />
        <HStack spacing={12}>
          <Button
            modifiers={[buttonStyle('bordered')]}
            onPress={() => ref.current?.focus()}
            label="Focus"
          />
          <Button
            modifiers={[buttonStyle('bordered')]}
            onPress={() => ref.current?.blur()}
            label="Blur"
          />
          <Button
            modifiers={[buttonStyle('bordered')]}
            onPress={() => ref.current?.setText('secret123')}
            label="Set text"
          />
        </HStack>
      </VStack>
    </Host>
  );
}

API

import { SecureField } from '@expo/ui/swift-ui';

Component

SecureField

Type: React.Element<SecureFieldProps>

Renders a SwiftUI SecureField for password input.

SecureFieldProps

autoFocus

Optional • Type: boolean • Default: false

If true, the secure field will be focused automatically when mounted.

children

Optional • Type: ReactNode

Slot children - supports <SecureField.Placeholder> with a <Text> child

maxLength

Optional • Type: number

Maximum number of characters allowed. Truncates natively as the user types.

onFocusChange

Optional • Type: (focused: boolean) => void

A callback triggered when the field gains or loses focus.

onTextChange

Optional • Type: (text: string) => void

A callback triggered when the text value changes.

If the callback is marked with the 'worklet' directive, it runs synchronously on the UI thread; otherwise it is delivered asynchronously as a regular JS event.

placeholder

Optional • Type: string

A text that is displayed when the field is empty.

ref

Optional • Type: Ref<SecureFieldRef>

text

Optional • Type: ObservableState<string>

An observable state that holds the current text. Create one with useNativeState('') or useNativeState('initial value'). If omitted, the field manages its own internal state.

Inherited props

Types

SecureFieldRef

Can be used for imperatively setting text and focus on the SecureField component.

PropertyTypeDescription
blur() => Promise<void>-
clear() => Promise<void>Clear the current text.
focus() => Promise<void>-
setText(newText: string) => Promise<void>-

Modifiers

Use these modifiers in the modifiers prop of the SwiftUI version.

Modifiers for SecureField

Modifiers for any view

Sources

The original Expo docs for this page:

On this page