iOS <TextInput multiline/> onChangeText does not fire if only one character
Nessuno ha ancora preso questa issue.
- Lingua principale
- C++
- Stelle
- 127k
- Fork
- 25.3k
- Merge medio
- 1g 23h
- PR unite (30g)
- 4
Descrizione
Description
The onChangeText for my TextInput used for a ChatBox is not working. After reset the text state to '' (after sending a message), the first character is always lost and the onChange event is not fired.
React Native Version
0.72.0
Output of npx react-native info
System:
OS: macOS 13.4
CPU: (10) x64 Apple M1 Pro
Memory: 45.71 MB / 16.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 16.14.0
path: /usr/local/bin/node
Yarn:
version: 1.22.19
path: /usr/local/bin/yarn
npm:
version: 8.3.1
path: /usr/local/bin/npm
Watchman:
version: 2022.07.04.00
path: /usr/local/bin/watchman
Managers:
CocoaPods:
version: 1.11.3
path: /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 22.4
- iOS 16.4
- macOS 13.3
- tvOS 16.4
- watchOS 9.4
Android SDK: Not Found
IDEs:
Android Studio: 2022.2 AI-222.4459.24.2221.9971841
Xcode:
version: 14.3.1/14E300c
path: /usr/bin/xcodebuild
Languages:
Java:
version: 15.0.2
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli": Not Found
react:
installed: 18.2.0
wanted: 18.2.0
react-native:
installed: 0.72.0
wanted: 0.72.0
react-native-macos: Not Found
npmGlobalPackages:
"react-native": Not Found
Android:
hermesEnabled: true
newArchEnabled: false
iOS:
hermesEnabled: true
newArchEnabled: false
Steps to reproduce
Happens only with TextInput with multiline enabled, only iOS, only this specific flow
- User input any characters into
<TextInput/>, and press Send - After msg is sent,
<TextInput/>value is cleared viasetText('') - After that, when user input one character,
onChangeTextdoesn't fire.
Other flows onChangeText works normally, such as
- Pressing 2 characters
- Clear the textinput via backspace
- Disable
multiline
Snack, code example, screenshot, or link to a repository
Snack: https://snack.expo.dev/@tylerc/blessed-ice-cream
The same issue can't be reproduced in Snack, only happens on iOS simulator or actual device
https://github.com/facebook/react-native/assets/86952204/2595e47e-4fda-4a8e-ae93-a4a3221f53b9
import React, {useCallback, useState} from 'react';
import {
SafeAreaView,
StyleSheet,
Text,
TextInput,
TouchableOpacity,
View,
} from 'react-native';
function App(): JSX.Element {
const [value, setValue] = useState('');
const onChangeText = useCallback((text: string) => {
console.log('onChangeText', text);
setValue(text);
}, []);
const onPressSend = useCallback(() => {
setValue('');
}, []);
return (
<SafeAreaView>
<View style={styles.container}>
<TextInput
style={styles.textInput}
multiline
value={value}
onChangeText={onChangeText}
/>
<TouchableOpacity style={styles.sendContainer} onPress={onPressSend}>
<Text
style={[styles.sendButton, textStateStyle(value).conditionalStyle]}>
{'Send'}
</Text>
</TouchableOpacity>
</View>
</SafeAreaView>
);
}
const textStateStyle = (value: string) =>
StyleSheet.create({
conditionalStyle: {color: value.length ? 'dodgerblue' : 'lightgrey'},
});
const styles = StyleSheet.create({
container: {flexDirection: 'row'},
textInput: {
height: 100,
flex: 1,
borderColor: 'black',
borderWidth: 1,
marginLeft: 5,
},
sendContainer: {
alignItems: 'center',
justifyContent: 'center',
padding: 10,
},
sendButton: {fontSize: 16, fontWeight: '800'},
});
export default App;
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Iniziare con la riproduzione multiline di TextInput fornita su un simulatore o dispositivo iOS, concentrandosi sul reset del valore controllato dopo Send e sul percorso di input del primo carattere. Tracciare il punto di ingresso TextInput onChangeText e verificare che il primo carattere dopo setValue('') venga fornito; confermare che i flussi esistenti continuino a funzionare.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- react-native
- Ambito
- mobile
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100