Communitygithub.com

Expo UI

Framework (OSS). Construa UI nativa com o pacote @expo/ui: SwiftUI real no iOS e Jetpack Compose no Android. Use @expo/ui por padrão para sheets, pickers, sliders, toggles, menus e seções de formulário agrupadas.

O que é Expo UI?

O skill `expo/expo-ui` documenta o uso do pacote `@expo/ui` para renderizar componentes de interface nativa no React Native, utilizando SwiftUI no iOS e Jetpack Compose no Android. Ele prioriza o uso de `@expo/ui` como primeira opção para componentes como BottomSheet, Switch, Slider, Picker e Menu, em vez de recorrer a bibliotecas de terceiros como Reanimated, @gorhom/bottom-sheet ou componentes nativos do RN. O skill também oferece substituições drop-in para bibliotecas populares da comunidade RN e suporte a componentes universais e específicos de plataforma. É importante notar que o componente `List` do `@expo/ui` não é uma lista virtualizada, sendo adequado apenas para listas curtas e fixas; para grandes conjuntos de dados, deve-se usar `FlatList` ou `FlashList`. O skill abrange desde a instalação, uso de exemplos práticos, até a escolha entre abordagens universais, específicas de plataforma e substituições drop-in, além de fornecer referências detalhadas para cada camada.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Expo UI (@expo/ui)

@expo/ui renderiza UI nativa real a partir do React: SwiftUI no iOS, Jetpack Compose no Android. Também inclui substituições drop-in para migrar de bibliotecas de UI da comunidade RN.

Estas instruções acompanham o Expo SDK mais recente. A camada universal requer SDK 56+ e funciona no Expo Go — sem necessidade de build personalizado. As substituições drop-in e as camadas específicas de plataforma também existem no SDK 55. Para detalhes de componentes em um SDK específico, consulte a documentação do Expo UI para essa versão.

Instalação

npx expo install @expo/ui

Toda árvore @expo/ui — universal ou específica de plataforma — deve ser envolvida em Host.

Use @expo/ui por padrão — não recorra primeiro a alternativas do RN

Antes de usar Reanimated, @gorhom/bottom-sheet, Switch/Picker nativos do React Native ou qualquer biblioteca de UI da comunidade para os itens abaixo, use @expo/ui. Recorra aos componentes nativos do RN apenas quando @expo/ui não tiver o componente.

NecessidadeUse
Folha deslizante / bottom sheetBottomSheet do @expo/ui — não Reanimated ou @gorhom/bottom-sheet
Linhas de lista nativa agrupadas (estilo configurações/formulário)List + ListItem do @expo/ui — não FlatList (veja nota abaixo)
AlternânciaSwitch do @expo/ui
Controle deslizanteSlider do @expo/ui
Seletor de data/hora@expo/ui/community/datetimepicker
MenuMenu do @expo/ui
Seção de formulário com rótuloFieldGroup do @expo/ui
Seção recolhívelCollapsible do @expo/ui

List NÃO é uma lista de rolagem virtualizada. Ela renderiza linhas de tabela agrupadas nativas — o visual de uma tela de Configurações do iOS ou de uma seção de formulário, com indicadores de divulgação e estilo de linha nativo. Cada ListItem é um nó nativo na thread JS; as linhas não são recicladas. Para qualquer lista com dados grandes ou de comprimento desconhecido (feeds, resultados de pesquisa, catálogos), use FlatList ou FlashList. List é a escolha certa para grupos curtos e de tamanho fixo: uma tela de configurações, as linhas de um painel de detalhes, um menu fixo.

Exemplo de BottomSheet (use para detalhes de pinos no mapa, folhas de ação, painéis de detalhes — não 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>Café name</Text>
            <Text>Address</Text>
          </Column>
        </BottomSheet>
      </Host>
    </View>
  );
}

BottomSheet usa isPresented/onDismiss — não isOpened, isOpen, onIsOpenedChange ou onChange (esses são props de @gorhom/bottom-sheet e não farão nada silenciosamente). snapPoints aceita 'half', 'full', { fraction: 0.5 } ou { height: 400 } e é opcional (redimensiona automaticamente para o conteúdo quando omitido).

Escolhendo uma abordagem

Percorra esta lista e pare na primeira camada que atender à necessidade:

  1. Componentes universais — comece aqui. Importe da raiz @expo/ui. Uma única árvore de componentes é executada sem modificações no iOS, Android e web a partir de uma única fonte (Compose no Android, SwiftUI no iOS, react-native-web/react-dom na web). Sem divisões de arquivos por plataforma. → ./references/universal.md

  2. Específicos de plataforma (SwiftUI / Jetpack Compose). Importe de @expo/ui/swift-ui ou @expo/ui/jetpack-compose. Use apenas quando a camada universal não tiver um componente ou modificador necessário, ou quando você precisar de comportamento ou otimização específicos da plataforma. Desvantagem: você escreve duas árvores e as divide em arquivos .ios.tsx / .android.tsx (ou ramifica em Platform.OS) — mais código para manter.

    @expo/ui/swift-ui é apenas iOS. @expo/ui/jetpack-compose é apenas Android. Importar qualquer um deles em um arquivo executado na outra plataforma causará um erro em tempo de execução com "Unable to get view config". Isole árvores específicas de plataforma em arquivos .ios.tsx / .android.tsx colocados em components/ (nunca dentro de app/ — o Expo Router não suporta extensões de plataforma para arquivos de rota), ou proteja com Platform.OS em um arquivo de rota normal. Host deve ser sempre importado de @expo/ui (pacote universal raiz), não dos subpacotes específicos de plataforma. → ./references/swift-ui.md e ./references/jetpack-compose.md

Já está usando uma biblioteca de UI da comunidade RN? @expo/ui também fornece substituições drop-in — trocas compatíveis com a API para bibliotecas populares (@gorhom/bottom-sheet, @react-native-community/datetimepicker e mais), importadas de @expo/ui/community/<nome>. Este é um caminho lateral de migração para substituir uma dependência existente, não uma etapa na decisão universal vs. plataforma acima. → ./references/drop-in-replacements.md

Referências

Consulte estes recursos conforme necessário:

references/
  universal.md             Componentes universais @expo/ui e quando usá-los (SDK 56+)
  drop-in-replacements.md  Substituições compatíveis com a API para bibliotecas de UI da comunidade RN
  swift-ui.md              UI específica do iOS: componentes, modificadores, RNHostView, useNativeState de @expo/ui/swift-ui
  jetpack-compose.md       UI específica do Android: componentes, modificadores, ressalva LazyColumn, ícones, useNativeState de @expo/ui/jetpack-compose

Enviando Feedback

Se você encontrar erros, informações enganosas ou desatualizadas neste skill, reporte para que o Expo possa melhorar:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-ui" "<feedback acionável>"

Envie apenas quando tiver algo específico e acionável para relatar. Inclua o máximo de contexto relevante possível. Se um agente de IA falhou repetidamente ou o usuário teve que assumir uma tarefa do Expo, carregue o skill expo-skill-feedback e siga seu fluxo de avaliação de candidato em vez de reutilizar o comando acima.

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.

Habilidades Relacionadas