J'utilise react native pour créer une application mobile. Je gère la position du clavier sur mes écrans en utilisant KeyboardAvoidingView, SafeAreaView et ScrollView. J'utilise cet ordre pour gérer la position du clavier:
<KeyboardAvoidingView style={{ flex: 1 }} behavior="padding" enabled> <SafeAreaView> <ScrollView> <Header leftComponent={{ icon: "cancel", color: "#fff", size: 30, onPress: () => navigate("Dashboard") }} centerComponent={{ text: "Ajouter une demande", style: { color: "#fff", fontSize: 18 } }} rightComponent={{ icon: "help", color: "#fff", size: 30, fontWeight: "bold", onPress: () => Alert.alert("En cours de développement") }} backgroundColor="rgba(82, 159, 197, 1)" // outerContainerStyles={{ height: Platform.OS === "ios" ? 70 : 70 - 24 }} containerStyle={ { // marginTop: Platform.OS === "ios" ? 0 : 15 } } /> <View> <Input placeholder="INPUT WITH CUSTOM ICON" leftIcon={<Icon name="user" size={24} color="black" />} /> </View> </ScrollView> </SafeAreaView> </KeyboardAvoidingView>
Ma question est la suivante: quel est le meilleur ordre pour utiliser ces 3 composants pour éviter une meilleure position du clavier
3 Réponses :
SafeAreaView
fonctionne uniquement avec iOS
. Par conséquent, il est supposé que vous utilisez iOS
. Si votre projet est iOS
, vous pouvez utiliser KeyboardAwareScrollView
.
SafeAreaView
doit être en haut car il couvre la zone de l'écran.
Exemple de KeyboardAwareScrollView
Usage
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' ... <SafeAreaView> <KeyboardAwareScrollView> <View> <TextInput /> </View> </KeyboardAwareScrollView> </SafeAreaView>
Bonjour, vous recommandez d'utiliser cette librairie à la place du composant natif KeyboardAvoidingView?
Oui, @KhaledSi vous créez le projet iOS, vous pouvez travailler beaucoup plus confortablement.
Voici une autre solution sans avoir besoin d'une bibliothèque externe telle que react-native-keyboard-aware-scroll-view
.
J'ai créé un composant ScreenWrapper
pour gérer le problème des ScreenWrapper
:
import React, { ReactElement } from 'react'; import { KeyboardAvoidingView, Platform, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; const ScreenWrapper = ({ children }: Props): ReactElement => { return ( <SafeAreaView style={{ flex: 1 }}> { Platform.OS === 'ios' ? ( <KeyboardAvoidingView style={{ flex: 1 }} behavior="padding"> {children} </KeyboardAvoidingView> ) : ( <> {children} </> ) } </SafeAreaView> ); }; export default ScreenWrapper;
Comme Android cherche à rendre les choses grandement sans le KeyboardAvoidingView
, j'ai décidé de l'utiliser uniquement pour les E / S, c'est plus simple à gérer.
J'utilise le padding
car il correspond à mon besoin, mais vous voudrez peut-être le changer.
Je recommande de lire cet excellent article de blog pour plus d'informations. J'ai créé ce wrapper grâce à lui.
Voici un exemple de composant réutilisable sans bibliothèque et comprend KeyboardAvoidingView, SafeAreaView et ScrollView. Cela permet également d'étendre la vue de défilement à sa pleine hauteur.
import { KeyboardAvoidingView, SafeAreaView, ScrollView } from 'react-native'; import React from 'react'; const ScreenContainer = props => { const { children } = props; return ( <SafeAreaView style={ { flex: 1 } }> <KeyboardAvoidingView behavior={ Platform.OS === 'ios' ? 'padding' : 'height' } style={ { flex: 1 } } > <ScrollView contentInsetAdjustmentBehavior="automatic" keyboardShouldPersistTaps="handled" > { children } </ScrollView> </KeyboardAvoidingView> </SafeAreaView> ); }; export default ScreenContainer;