J'utilise React-Navigation dans mon application et l'application consiste en StackNavigator avec plusieurs écrans, dont certains ont TextInput avec autoFocus={true}
Problème: sur ces écrans lors du rendu du composant, la hauteur de l'écran est définie dans le constructeur:
constructor(props) {
super(props);
this.state = {
height: Dimensions.get('window').height,
};
}
Mais, puisque le autoFocus
de TextInput est true
, le clavier de cet écran s’affiche presque instantanément après le rendu , ce qui provoque la restitution du composant en raison de l'événement eventListener ajouté au clavier dans ComponentWillMount:
componentWillMount() {
this.keyboardWillShowListener = Keyboard.addListener(
"keyboardWillShow",
this.keyboardWillShow.bind(this)
);
}
keyboardWillShow(e) {
this.setState({
height:
Dimensions.get("window").height * 0.9 - e.endCoordinates.height
});
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
}
Cela affecte les performances et je voudrais éviter les rediffusions inutiles.
Questions:
1. Est-il possible de définir la hauteur dynamique (en fonction du périphérique) du clavier dans les ScreenProps de React-Navigation?
2. Est-il possible de faire la même chose avec les state.params de React-Navigation?
3. Existe-t-il un autre moyen de résoudre ce problème, mis à part l'application de KeyboardAvoidingView ou ce module ?
C'est ce que j'ai fait:
Si l'application comporte "Écran d'autorisation/connexion/inscription", alors:
Dans le composantWillMount, ajoutez KeyboardListeners comme expliqué ici :
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow);
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide);
Ajoutez autoFocus à un courrier électronique/à un numéro de téléphone/à un autre "premier" TextInput sur la page, de sorte que le clavier s’affiche au chargement de l’écran.
Dans _keyboardDidShow
fonction utilisée comme KeyboardListener, procédez comme suit:
_keyboardDidShow(e) {
this.props.navigation.setParams({
keyboardHeight: e.endCoordinates.height,
normalHeight: Dimensions.get('window').height,
shortHeight: Dimensions.get('window').height - e.endCoordinates.height,
});
}
Dimensions est une API de React-Native, n'oubliez pas de l'importer comme vous importez n'importe quel composant React-Native.
Après cela, lors de la redirection vers la page suivante, transmettez ces paramètres et n'oubliez pas de continuer à les transmettre à d'autres écrans afin de ne pas perdre ces données:
this.props.navigation.navigate('pageName', { params: this.props.navigation.state.params });