react-native-keyboard-controller reemplaza la adivinanza en KeyboardAvoidingView con la altura del teclado sincronizada con la animación nativa. En pantallas de formulario, eso significa que el TextInput activo se mantiene visible, el desplazamiento se siente como una hoja del sistema, y Android se comporta igual que iOS - sin props behavior por plataforma.
Tarjeta de receta de referencia rápida - lista para copiar-pegar.
// app/_layout.tsx - provider once at the rootimport { Stack } from "expo-router";import { KeyboardProvider } from "react-native-keyboard-controller";export default function RootLayout() { return ( <KeyboardProvider> <Stack /> </KeyboardProvider> );}
KeyboardProvider faltante - KeyboardAwareScrollView vuelve a un comportamiento inconsistente o altura de teclado cero. Solución: Envuelve el layout raíz, no pantallas individuales.
bottomOffset dejado en 0 con un toolbar - El campo enfocado se oculta bajo KeyboardToolbar. Solución: Establece bottomOffset a altura del toolbar + área segura (frecuentemente 44-62 px antes de inset).
keyboardShouldPersistTaps omitido - Los toques en botones de envío descartan el teclado sin activar onPress. Solución:keyboardShouldPersistTaps="handled" en la vista de desplazamiento.
Anidar KeyboardAvoidingView dentro de KeyboardAwareScrollView - El ajuste doble sobrepasa y causa rebote. Solución: Elige una estrategia - keyboard-controller O vista de evitar, no ambas.
FlatList dentro de KeyboardAwareScrollView - Las listas virtualizadas dentro de vistas de desplazamiento rompen la medición y el rendimiento. Solución: Pon las entradas en ListHeaderComponent / ListFooterComponent, o usa useKeyboardHandler para diseños de chat.
Redimensionamiento de tab bar de Android - Las pestañas inferiores se deslizan con el teclado y aplastan el formulario. Solución:softwareKeyboardLayoutMode: "pan" o tabBarHideOnKeyboard: true.
Reanimated no configurado - Los worklets de useKeyboardHandler fallan silenciosamente o lanzan excepciones en Android. Solución: Verifica el plugin de babel de react-native-reanimated per Expo Reanimated docs.