domains / families / software-engineering / expo-ui

expo-ui

combined

Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching. Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android rendered from React in an Expo or React Native app.

When to use

When not to use

Skill page

Conflict

The expo/skills copy is the upstream, detailed procedure, but the sickn33 copy adds material constraints and workflow steps that the upstream copy lacks, so crowning one would hide a real alternative. The upstream copy contains the critical 'use @expo/ui by default' decision table, the explicit warning that List is not virtualized, and the BottomSheet prop contract (isPresented/onDismiss vs @gorhom props) with a code example. The sickn33 copy adds SDK 56 Expo Go vs dev-client build guidance, a 'When to Use' scoping section, and a Limitations section requiring verification against official docs and user approval for destructive actions. These are complementary, not redundant.