This repository was archived by the owner on Feb 25, 2020. It is now read-only.
[Fix RN TextInput focus bug with react-navigation] Add the node tag in navigation params after mounting a sceneview#19
Closed
gazoudoudou wants to merge 1 commit intoreact-navigation:masterfrom
gazoudoudou:add/nodeTag-nav-param-when-mount-a-sceneview
Closed
[Fix RN TextInput focus bug with react-navigation] Add the node tag in navigation params after mounting a sceneview#19gazoudoudou wants to merge 1 commit intoreact-navigation:masterfrom gazoudoudou:add/nodeTag-nav-param-when-mount-a-sceneview
gazoudoudou wants to merge 1 commit intoreact-navigation:masterfrom
gazoudoudou:add/nodeTag-nav-param-when-mount-a-sceneview
Conversation
Contributor
|
See my review here: react-navigation/native#6 (review) I think we need to go back to the drawing board on this one. It is a real issue, but I think we should fix it with a context API that allows text inputs to negotiate focus with navigators. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I noticed a bug while using react-navigation + the react-native TextInput component.
HOW TO REPRODUCE THE BUG :
Let’s consider the following app with only 2 pages :
Page1.js :
Page2.js :
App.js :
On Page1 you have a single button to navigate to Page2. On Page2, you’d like that a TextInput is focused when you arrive on this page. You also have a « dismiss » button to close the keyboard when the textinput is focused.
You could use the TextInput props « autoFocus » so that it is focused at the beginning. There is absolutely no bug in this case.
But instead, I tried to create a ref « textinput », and called this.textinput.focus() in the componentDidMount method to focus it at the beginning. It works, but when I press the dismiss button, the keyboard won’t close.
After digging, I found that a blur call is made when you arrive on Page2, coming from the @react-navigation/native/src/KeyboardAwareNavigator.js file. In _handleTransitionStart, transitionProps.index !== prevTransitionProps.index is true because you are switching pages, and !!currentField too in the « this.textinput.focus() » case. As a consequence, it blurs the textinput, the TextInput.State.currentlyFocusedField() becomes null, and you cannot dismiss the keyboard anymore.
MY FIX :
I tried to add another condition in addition to the if(currentField) one, to decide when we should blur the currently focused textinput. According to me, it should be something like if(currentField && previousPage includes currentField) or if(currentField && currentPage does not include currentField).
To do so, I used the viewIsDescendantOf method from UIManager, react-native (to check if the currently focused field is a child of the previous scene). In addition to the tag of the currently focused field (which is precisely currentField), I needed the tag of the previous scene.
In this PR, I tried to add the node tag of a sceneview in the nav params.
The rest is made in this PR : react-navigation/native#6