O problema com o teclado não dispensar fica mais grave se você tiver keyboardType='numeric'
, pois não há como descartá-lo.
Substituir o View pelo ScrollView não é uma solução correta, como se você tivesse vários textInput
s ou button
s, tocar neles enquanto o teclado estiver levantado só descartará o teclado.
A maneira correta é encapsular o View com TouchableWithoutFeedback
e chamarKeyboard.dismiss()
EDIT: Agora você pode usar ScrollView
com keyboardShouldPersistTaps='handled'
para descartar o teclado apenas quando a torneira não é manuseada pelas crianças (por exemplo, tocando em outros textos).
Se você tem
<View style={{flex: 1}}>
<TextInput keyboardType='numeric'/>
</View>
Mude para
<ScrollView contentContainerStyle={{flexGrow: 1}}
keyboardShouldPersistTaps='handled'
>
<TextInput keyboardType='numeric'/>
</ScrollView>
ou
import {Keyboard} from 'react-native'
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View style={{flex: 1}}>
<TextInput keyboardType='numeric'/>
</View>
</TouchableWithoutFeedback>
EDIT: Você também pode criar um componente de ordem superior para descartar o teclado.
import React from 'react';
import { TouchableWithoutFeedback, Keyboard, View } from 'react-native';
const DismissKeyboardHOC = (Comp) => {
return ({ children, ...props }) => (
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<Comp {...props}>
{children}
</Comp>
</TouchableWithoutFeedback>
);
};
const DismissKeyboardView = DismissKeyboardHOC(View)
Basta usá-lo assim
...
render() {
<DismissKeyboardView>
<TextInput keyboardType='numeric'/>
</DismissKeyboardView>
}
NOTA: accessible={false}
é necessário para que o formulário de entrada continue acessível pelo VoiceOver. Pessoas com deficiência visual agradecerão!