Communitygithub.com

expo/expo-ui

Framework (OSS). Créez une UI native avec le package @expo/ui : véritable SwiftUI sur iOS et Jetpack Compose sur Android. Utilisez @expo/ui par défaut pour les feuilles (BottomSheet), les sélecteurs, les curseurs, les interrupteurs, les menus et les sections de formulaire groupées — n'utilisez pas Reanimated, @gorhom/bottom-sheet, ou les Picker/Switch intégrés de RN ; préférez @expo/ui. Revenez aux composants intégrés de RN uniquement lorsque @expo/ui ne fournit pas le composant nécessaire. REMARQUE : List de @expo/ui affiche des lignes groupées natives comme un écran Réglages iOS — ce n'est PAS une liste virtualisée ; utilisez FlatList/FlashList pour les grands ensembles de données. Couvre les composants universels (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), les remplacements directs pour les bibliothèques communautaires RN et les arbres SwiftUI/Jetpack Compose spécifiques à la plateforme. Ne concerne pas la navigation Expo Router, Reanimated ou la récupération de données.

Qu'est-ce que expo-ui ?

Cette compétence vous guide dans l'utilisation de `@expo/ui` pour construire des interfaces utilisateur natives avec React : SwiftUI sur iOS et Jetpack Compose sur Android. Elle vous encourage à utiliser `@expo/ui` par défaut pour des composants comme BottomSheet, Switch, Slider, Picker, FieldGroup et Collapsible, en évitant Reanimated, `@gorhom/bottom-sheet` et les composants intégrés de React Native. Le composant `List` est conçu pour des listes groupées courtes (comme les écrans de réglages) et ne doit pas être utilisé comme une liste virtualisée ; pour les grands ensembles de données, privilégiez FlatList ou FlashList. La compétence couvre trois approches : les composants universels, les composants spécifiques à la plateforme (SwiftUI/Jetpack Compose avec des fichiers `.ios.tsx`/`.android.tsx`), et les remplacements directs pour les bibliothèques communautaires RN existantes. Elle est compatible avec Expo SDK 56+ (composants universels) et SDK 55 et fonctionne dans Expo Go sans construction personnalisée.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-ui

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Expo UI (@expo/ui)

@expo/ui affiche une UI véritablement native à partir de React : SwiftUI sur iOS, Jetpack Compose sur Android. Il fournit également des remplacements directs pour migrer depuis les bibliothèques UI communautaires RN.

Ces instructions suivent le dernier SDK Expo. La couche universelle nécessite SDK 56+ et fonctionne dans Expo Go — aucune construction personnalisée n'est nécessaire. Les remplacements directs et les couches spécifiques à la plateforme existent également sur SDK 55. Pour les détails des composants sur un SDK spécifique, référez-vous à la documentation Expo UI pour cette version.

Installation

npx expo install @expo/ui

Tout arbre @expo/ui — universel ou spécifique à une plateforme — doit être enveloppé dans Host.

Utilisez @expo/ui par défaut — n'utilisez pas d'abord des alternatives RN

Avant d'utiliser Reanimated, @gorhom/bottom-sheet, le Switch/Picker intégré de React Native, ou toute bibliothèque UI communautaire pour les éléments ci-dessous, utilisez @expo/ui à la place. Revenez aux composants intégrés de RN uniquement lorsque @expo/ui ne fournit pas le composant nécessaire.

BesoinUtilisez
Feuille coulissante / bottom sheetBottomSheet de @expo/ui — pas Reanimated ou @gorhom/bottom-sheet
Lignes de liste native groupées (style réglages/formulaire)List + ListItem de @expo/ui — pas FlatList (voir la note ci-dessous)
InterrupteurSwitch de @expo/ui
CurseurSlider de @expo/ui
Sélecteur date/heure@expo/ui/community/datetimepicker
MenuMenu de @expo/ui
Section de formulaire avec étiquetteFieldGroup de @expo/ui
Section repliableCollapsible de @expo/ui

List n'est PAS une liste défilante virtualisée. Elle affiche des lignes de tableau groupées natives — l'aspect visuel d'un écran Réglages iOS ou d'une section de formulaire, avec des indicateurs de divulgation et un style de ligne natif. Chaque ListItem est un nœud natif sur le thread JS ; les lignes ne sont pas recyclées. Pour toute liste contenant des données volumineuses ou de longueur inconnue (flux, résultats de recherche, catalogues), utilisez FlatList ou FlashList à la place. List est le bon choix pour des groupes courts et de longueur fixe : un écran de réglages, les lignes d'un panneau de détail, un menu fixe.

Exemple de BottomSheet (utilisez ceci pour les détails d'un marqueur sur une carte, les feuilles d'action, les panneaux de détail — pas Reanimated) :

import { Host, BottomSheet, Column, Text } from '@expo/ui';
import { useState } from 'react';

export default function MapScreen() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <View style={{ flex: 1 }}>
      <MapView onMarkerPress={() => setIsOpen(true)} />
      <Host>
        <BottomSheet
          isPresented={isOpen}
          onDismiss={() => setIsOpen(false)}
          snapPoints={['half', 'full']}
        >
          <Column>
            <Text>Nom du café</Text>
            <Text>Adresse</Text>
          </Column>
        </BottomSheet>
      </Host>
    </View>
  );
}

BottomSheet utilise isPresented/onDismiss — pas isOpened, isOpen, onIsOpenedChange ou onChange (ce sont des propriétés de @gorhom/bottom-sheet et ne feront rien en silence). snapPoints accepte 'half', 'full', { fraction: 0.5 } ou { height: 400 } et est optionnel (taille automatiquement en fonction du contenu lorsqu'il est omis).

Choisir une approche

Parcourez cette liste et arrêtez-vous au premier niveau qui répond au besoin :

  1. Composants universels — commencez ici. Importez depuis la racine @expo/ui. Un arbre de composants s'exécute sans modification sur iOS, Android et le web à partir d'une seule source (Compose sur Android, SwiftUI sur iOS, react-native-web/react-dom sur le web). Aucun fractionnement de fichier par plateforme. → ./references/universal.md

  2. Spécifique à la plateforme (SwiftUI / Jetpack Compose). Importez depuis @expo/ui/swift-ui ou @expo/ui/jetpack-compose. Utilisez uniquement lorsque la couche universelle ne dispose pas d'un composant ou modificateur dont vous avez besoin, ou lorsque vous avez besoin d'un comportement ou d'une optimisation spécifique à la plateforme. Inconvénient : vous écrivez deux arbres et les divisez en fichiers .ios.tsx / .android.tsx (ou branchez sur Platform.OS) — plus de code à maintenir.

    @expo/ui/swift-ui est réservé à iOS. @expo/ui/jetpack-compose est réservé à Android. Importer l'un ou l'autre dans un fichier qui s'exécute sur l'autre plateforme plantera à l'exécution avec des erreurs "Impossible d'obtenir la configuration de la vue". Isolez les arbres spécifiques à la plateforme dans des fichiers .ios.tsx / .android.tsx placés dans components/ (jamais dans app/ — Expo Router ne prend pas en charge les extensions de plateforme pour les fichiers de route), ou protégez avec Platform.OS dans un fichier de route normal. Host doit toujours être importé depuis @expo/ui (le package racine universel), jamais depuis les sous-packages spécifiques à la plateforme. → ./references/swift-ui.md et ./references/jetpack-compose.md

Vous utilisez déjà une bibliothèque UI communautaire RN ? @expo/ui fournit également des remplacements directs — des substituts compatibles au niveau de l'API pour les bibliothèques populaires (@gorhom/bottom-sheet, @react-native-community/datetimepicker, etc.), importés depuis @expo/ui/community/<nom>. Il s'agit d'un chemin de migration pour remplacer une dépendance existante, et non d'une étape dans la décision universel vs plateforme ci-dessus. → ./references/drop-in-replacements.md

Références

Consultez ces ressources selon vos besoins :

references/
  universal.md             Composants @expo/ui universels et quand les utiliser (SDK 56+)
  drop-in-replacements.md  Remplacements compatibles au niveau de l'API pour les bibliothèques UI communautaires RN
  swift-ui.md              UI spécifique à iOS : composants, modificateurs, RNHostView, useNativeState de @expo/ui/swift-ui
  jetpack-compose.md       UI spécifique à Android : composants, modificateurs, mise en garde LazyColumn, icônes, useNativeState de @expo/ui/jetpack-compose

Soumettre un retour d'expérience

Si vous rencontrez des erreurs, des informations trompeuses ou obsolètes dans cette compétence, signalez-les pour qu'Expo puisse s'améliorer :

npx --yes submit-expo-feedback@latest --category skills --subject "expo-ui" "<retour d'expérience actionnable>"

Ne soumettez que lorsque vous avez quelque chose de spécifique et d'actionnable à signaler. Incluez autant de contexte pertinent que possible. Si un agent IA a échoué à plusieurs reprises ou si l'utilisateur a dû reprendre une tâche Expo, chargez la compétence expo-skill-feedback et suivez son flux eval-candidate au lieu de réutiliser la commande ci-dessus.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

expo/expo-skill-eval

Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional). Use when the user wants to eval an Expo skill, test that a skill produces working code, benchmark a skill with device screenshots, or verify a skill's output renders correctly.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

Skills associés