React Native 0.86 (Expo SDK 57) habilita o edge-to-edge no Android por padrão - seu aplicativo desenha atrás das barras de status e navegação, alinhando-se com as diretrizes do Android 15. Este cookbook cobre os padrões do RN, expo-status-bar, expo-navigation-bar e os padrões de inset que mantêm os botões tocáveis.
// app/_layout.tsx - shell raiz para edge-to-edge Androidimport { Stack } from "expo-router";import { StatusBar } from "expo-status-bar";import * as NavigationBar from "expo-navigation-bar";import { useEffect } from "react";import { Platform } from "react-native";import { SafeAreaProvider } from "react-native-safe-area-context";export default function RootLayout() { useEffect(() => { if (Platform.OS !== "android") return; NavigationBar.setBackgroundColorAsync("#ffffff00"); // transparente NavigationBar.setButtonStyleAsync("dark"); }, []); return ( <SafeAreaProvider> <StatusBar style="auto" translucent /> <Stack screenOptions={{ headerShown: false }} /> </SafeAreaProvider> );}
// Tela com barra de abas - omita o inset inferior; preencha o FAB manualmenteimport { Platform, View } from "react-native";import { SafeAreaView, useSafeAreaInsets } from "react-native-safe-area-context";export function OrdersScreen() { const insets = useSafeAreaInsets(); return ( <SafeAreaView style={{ flex: 1 }} edges={["top", "left", "right"]}> <View style={{ flex: 1 }}>{/* conteúdo */}</View> {/* FAB limpa a barra de navegação por gestos */} <View style={{ position: "absolute", right: 16, bottom: insets.bottom + 16 }} /> </SafeAreaView> );}
Quando usar isso:
Botões inferiores ficam sob a pílula de navegação por gestos do Android.
Ícones da barra de status ficam invisíveis em uma imagem de herói escura (ou vice-versa).
QA relata diferenças de layout entre emuladores API 33 e API 35.
Você deseja cabeçalhos imersivos de tela cheia sem abrir mão de alvos de toque seguros.
RN 0.86 opta pelo edge-to-edge no nível da atividade/janela nativa - a janela se estende sob as barras do sistema.
Insets de react-native-safe-area-context relatam o quanto da tela é obscurecido pela barra de status, recorte de exibição e barra de navegação (gesto ou 3 botões).
expo-status-bar define a cor do ícone/texto (light | dark | auto) - não substitui o preenchimento de inset.
expo-navigation-bar controla o fundo da barra de navegação do Android, estilo do botão, visibilidade e posição (relative vs absolute).
Evitação de teclado é separada - KeyboardAvoidingView / react-native-keyboard-controller ainda se aplicam; o inset inferior e o teclado podem se sobrepor.
A maioria dos templates do Expo SDK 57 habilita o edge-to-edge via prebuild. Se você mantém um fork bare android/:
// app.config.ts - prefira a configuração em vez de editar manualmente MainActivityexport default { expo: { android: { // O template RN 0.86 define edge-to-edge; confirme após o prebuild }, plugins: [ [ "expo-build-properties", { android: { // compileSdk / targetSdk 35 para o comportamento mais recente da barra compileSdkVersion: 35, targetSdkVersion: 35, }, }, ], ], },};
Inspecione android/app/src/main/res/values/styles.xml após o prebuild - windowLayoutInDisplayCutoutMode e cores de status/barra de navegação transparentes devem estar presentes no template RN 0.86.
SafeAreaView e insets.top manual combinados - dobram o espaço superior. Correção: Um dono por eixo.
Ícones de status brancos em cabeçalho branco - StatusBar style="light" em fundo claro. Correção: Combine style com a luminância do fundo por tela.
Barra de abas sobrepõe o indicador inicial - Abas do React Navigation podem precisar de ajuste de safeAreaInsets. Correção: Passe tabBarStyle: { height: 56 + insets.bottom } ou use os padrões da biblioteca no SDK 57.
Testando apenas com navegação de 3 botões - A navegação por gestos altera a altura do inset inferior. Correção: Alterne Configurações → Navegação do sistema no emulador.
Cor opaca da barra de navegação lutando contra a transparência - Algumas skins de OEM ignoram o alfa. Correção:setPositionAsync("absolute") + reaplicar ao focar.
Assumindo que expo-status-bar adiciona preenchimento - Ele apenas estiliza ícones. Correção: Sempre combine com react-native-safe-area-context.
É o padrão no template Android do RN 0.86. Desabilitá-lo requer mudanças de tema nativas e vai contra a direção da plataforma.
Prefira aprender os padrões de inset em vez de optar por não participar.
Preciso de expo-navigation-bar se eu só usar SafeAreaView?
SafeAreaView lida com o preenchimento do layout; expo-navigation-bar lida com a cor da barra de navegação e o contraste dos botões.
Barras de navegação transparentes geralmente precisam de ambos.
Por que meu conteúdo salta quando o teclado abre?
O teclado e a área segura são independentes. Combine KeyboardAvoidingView com o inset inferior na mesma tela com cuidado - evite preenchimento inferior duplo.
Edge-to-edge afeta o iOS?
O iOS sempre usou áreas seguras para entalhes. O Android agora se comporta de forma semelhante - SafeAreaProvider multiplataforma ajuda ambos.
Como testo o contraste dos ícones da barra de status?
Alterne fundos de heróis claros/escuros no Storybook ou em uma tela de menu de desenvolvimento.
Execute em Samsung/Pixel físicos - a coloração OEM difere do AVD.
As abas do Expo Router podem lidar com insets automaticamente?
Versões recentes de @react-navigation/bottom-tabs respeitam áreas seguras, mas barras de abas personalizadas precisam de insets.bottom manual.
E o Android 15 forçando edge-to-edge?
O direcionamento para API 35 está alinhado com as expectativas da plataforma. O template RN 0.86 está à frente da curva de políticas - ainda teste na API 35.
Como depuro valores de inset?
Registre useSafeAreaInsets() em builds de desenvolvimento.
Compare emulador vs dispositivo - os insets de navegação por gestos diferem (~24–48dp).
A tematização da barra de navegação afeta apenas a pílula de gestos?
setButtonStyleAsync afeta os modos de 3 botões e gestos; a cor de fundo afeta a área da barra atrás da pílula.
Onde está o mergulho profundo de layout para áreas seguras?