Skip to main content
reopt Handbook
reopt Handbook
Expo Enterprise Production

New Architecture

SDK 56 Breaking ChangesNew Architecture Deep DiveReact 19.2 Concurrency Patterns

Native Extensions

Expo UI Nativeexpo-widgets Home Screen WidgetsExpo Modules API v2 Native Extensions

Build and Release

Advanced EAS Build PipelinesEAS Update OTA StrategySecurity, Signing, and Compliance

Operations and Quality

Performance Monitoring and ProfilingTesting StrategyEnterprise Distribution and MDM

Appendix

Verification ReportUpdates
Handbook›Expo Enterprise Production›Expo UI Native
한국어English

Expo UI Native

Declarative SwiftUI, Jetpack Compose, Universal API, and production rollout patterns.

Key takeaways

  • In SDK 56 the SwiftUI and Jetpack Compose APIs are stable, and the Universal @expo/ui API lets one codebase target Android, iOS, and web.
  • Write common screens with the Universal API and its Host root first; drop to @expo/ui/swift-ui or @expo/ui/jetpack-compose only for platform-specific behavior.
  • Several community libraries (bottom-sheet, slider, picker, pager) have drop-in candidates, but they are not guaranteed prop-level replacements.
  • Use react-native-worklets and useNativeState for high-frequency UI where JS round trips would be visible.
  • Expo UI components live in a native tree, so avoid measure()/onLayout and validate accessibility and Dynamic Color on real devices.

Overview

Expo UI lets React code declare native SwiftUI on iOS and Jetpack Compose on Android. In SDK 56, SwiftUI and Jetpack Compose APIs are stable, and Universal components let teams write shared Android, iOS, and web UI through @expo/ui.

SDK 56 status

  • SwiftUI support: stable
  • Jetpack Compose support: stable
  • Universal API: shared imports from @expo/ui
  • Expo Go support: included in the new default template
  • AI support: Expo Skills and Expo MCP help agents stay aligned with current APIs

Universal Components First

For SDK 56, write common screens with the Universal API first. Drop down to @expo/ui/swift-ui or @expo/ui/jetpack-compose only when the platform-specific behavior matters.

import { Button, Column, Host, Switch, Text } from '@expo/ui';

export default function SettingsScreen() {
  return (
    <Host style={{ flex: 1 }}>
      <Column spacing={12} alignment="center">
        <Text>Notification settings</Text>
        <Switch label="Enable notifications" value={enabled} onValueChange={setEnabled} />
        <Button label="Save" onPress={handleSave} />
      </Column>
    </Host>
  );
}

Host is the root for a Universal Expo UI subtree. It connects to native hosts on Android and iOS, and falls back to React Native views on web.

Platform-specific APIs

Use platform-specific packages when a screen needs native modifiers, native state, or controls not covered by the Universal API.

import { Platform } from 'react-native';

const NativeSettings = Platform.select({
  ios: () => require('@expo/ui/swift-ui').Form,
  android: () => require('@expo/ui/jetpack-compose').Column,
  default: () => require('@expo/ui').Column,
})();
PackageUse when
@expo/uishared form, control, sheet, text, and layout UI
@expo/ui/swift-uiiOS system forms, modifiers, and SwiftUI-specific controls
@expo/ui/jetpack-composeMaterial 3, Dynamic Color, and Compose modifiers

Drop-in Replacement Candidates

SDK 56 provides import-oriented migration paths for several community native UI libraries. Treat them as drop-in candidates, not guaranteed prop-level replacements.

Existing libraryExpo UI direction
@gorhom/bottom-sheetExpo UI BottomSheet
@react-native-community/datetimepickerExpo UI date/time controls
@react-native-community/sliderExpo UI Slider
@react-native-picker/pickerExpo UI Picker
react-native-pager-viewExpo UI pager components
@react-native-segmented-control/segmented-controlExpo UI segmented control

Native State and Worklet Callbacks

SDK 56 Expo UI integrates with react-native-worklets and native state primitives. Use this path for text input, animation, and high-frequency UI where JS round trips are visible.

import { Host, TextField, useNativeState } from '@expo/ui/swift-ui';

export function SearchField() {
  const value = useNativeState('');

  return (
    <Host matchContents>
      <TextField text={value} placeholder="Search" />
    </Host>
  );
}

AI Integration

Expo provides official Expo Skills such as expo-ui-swift-ui, expo-ui-jetpack-compose, and building-native-ui.

npx skills add expo/skills

Generated code still needs npx expo-doctor, TypeScript, and real device builds. Native layout, touch targets, system fonts, and Dynamic Color cannot be fully validated in a web preview.

Caveats

  • Expo UI components live in a native tree that differs from React Native View, so avoid measure() and onLayout dependencies.
  • Universal web APIs can still change; keep web critical flows under regression tests.
  • Native modifiers do not mean the same thing on each platform. Keep tokens shared but verify implementation per platform.
  • Check accessibility labels, keyboard behavior, and screen reader order for every replacement.

Related docs

Verification Report

Official sources, freshness, source conflicts, and code example verification for the Expo SDK 56 handbook.

SDK 56 Breaking Changes

React Native 0.85, Hermes V1, Expo Router separation, platform requirements, and migration checklist.

Cmd. /color

Claude Code Command Master · Set the current session prompt-bar color.

React 19.2 Concurrency Patterns

Mobile patterns for transitions, Suspense, and route-level loading in Expo SDK 56.

expo-widgets Home Screen Widgets

iOS WidgetKit, Live Activities, and data synchronization patterns with Expo.

On this page

OverviewUniversal Components FirstPlatform-specific APIsDrop-in Replacement CandidatesNative State and Worklet CallbacksAI IntegrationCaveats