domains / families / software-engineering / expo-ui
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.
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.