Skip to content

Commit 4d54b48

Browse files
AdamDanielKingfacebook-github-bot
authored andcommitted
Fix onSubmitEditing dispatch behavior with blurOnSubmit/multiline combinations.
Summary: Fixes #15863 on master. Behavior of `onSubmitEditing` is now consistent between iOS and Android. Tapping the submit button in a TextInput dispatches the event precisely when doing so does not make a newline (when blurOnSubmit is true or multiline is false). 1. Run this app on iOS and Android: ``` // flow import React, { Component } from 'react'; import { StyleSheet, TextInput, View } from 'react-native'; type State = { toggled: boolean }; type Props = { blurOnSubmit: boolean, multiline: boolean }; class ToggleColorInput extends Component<Props, State> { state: State = { toggled: false }; props: Props; toggle = () => { this.setState({ toggled: !this.state.toggled }); } render() { return ( <TextInput blurOnSubmit={this.props.blurOnSubmit} multiline={this.props.multiline} onSubmitEditing={this.toggle} style={[styles.textInput, {backgroundColor: this.state.toggled ? 'blue' : 'azure'}]} underlineColorAndroid='transparent' /> ) } } export default class App extends Component<{}> { render() { return ( <View> <ToggleColorInput blurOnSubmit={true} multiline={true} /> <ToggleColorInput blurOnSubmit={true} multiline={false} /> <ToggleColorInput blurOnSubmit={false} multiline={true} /> <ToggleColorInput blurOnSubmit={false} multiline={false} /> </View> ); } } const styles = StyleSheet.create({ textInput: { height: 75, borderWidth: 1, borderColor: 'black' } }); ``` 2. You see four TextInputs, with each combination of the `blurOnSubmit` and `multiline` properties. For each TextInput, type some text and tap the submit button. 3. The TextInputs in this test will toggle background color when they emit an `onSubmitEditing` event. Verify the following behavior on each platform: * blurOnSubmit && isMultiline => Submit event emitted, blurred, no newline inserted * blurOnSubmit && !isMultiline => Submit event emitted, blurred * !blurOnSubmit && isMultiline => Submit event emitted, newline inserted * !blurOnSubmit && !isMultiline => Submit event emitted Closes #16040 Differential Revision: D5877401 Pulled By: shergin fbshipit-source-id: 741bcc06d8b69d7025f2cb42dd0bee4fa01cd88e
1 parent aa8eb80 commit 4d54b48

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -737,23 +737,25 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent keyEvent) {
737737
InputType.TYPE_TEXT_FLAG_MULTI_LINE) != 0);
738738

739739
// Motivation:
740-
// * blurOnSubmit && isMultiline => Generate `submit` event; clear focus; prevent default behaviour (return true);
741-
// * blurOnSubmit && !isMultiline => Generate `submit` event; clear focus; prevent default behaviour (return true);
740+
// * blurOnSubmit && isMultiline => Clear focus; prevent default behaviour (return true);
741+
// * blurOnSubmit && !isMultiline => Clear focus; prevent default behaviour (return true);
742742
// * !blurOnSubmit && isMultiline => Perform default behaviour (return false);
743743
// * !blurOnSubmit && !isMultiline => Prevent default behaviour (return true).
744+
// Additionally we always generate a `submit` event.
744745

745-
if (blurOnSubmit) {
746-
EventDispatcher eventDispatcher =
747-
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
746+
EventDispatcher eventDispatcher =
747+
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
748748

749-
eventDispatcher.dispatchEvent(
750-
new ReactTextInputSubmitEditingEvent(
751-
editText.getId(),
752-
editText.getText().toString()));
749+
eventDispatcher.dispatchEvent(
750+
new ReactTextInputSubmitEditingEvent(
751+
editText.getId(),
752+
editText.getText().toString()));
753753

754+
if (blurOnSubmit) {
754755
editText.clearFocus();
755756
}
756757

758+
// Prevent default behavior except when we want it to insert a newline.
757759
return blurOnSubmit || !isMultiline;
758760
}
759761

0 commit comments

Comments
 (0)