Repository navigation
Conversation
Summary: Add a new RNTester example in TextInputSharedExamples to reproduce iOS and Android issues with auto-expanding multiline text fields. There is already an existing example, but an empty, uncontrolled variant is needed to reproduce certain issues. An existing iOS-only auto-expanding example is removed as well since it duplicates functionality. Changelog: [Internal] Differential Revision: D127048669
Summary: Fixes an issue where on iOS, multiline expanding TextInputs do not expand if the input starts off as empty and uncontrolled. ### Root Cause When a multiline TextInput on iOS is provided a `value` and `onChange()` prop, as shown in the [React Native docs](https://reactnative.dev/docs/textinput), the input grows as expected. However, uncontrolled inputs do not grow past the first initial line. On mount, `BaseTextInputShadowNode::updateStateIfNeeded()` writes state only if the text changes, so the first state write is skipped for empty, uncontrolled inputs. As a result, `TextAttributes` keeps the default `fontSizeMultiplier = NaN` which is carried over since iOS copies the previous state for subsequent keystrokes. During measurement, `attributedStringBoxToMeasure()` sees that the current multiplier doesn't match the stored multiplier of NaN and falls back to `props.text` which is empty for uncontrolled inputs. This causes the input to stay one-line tall. ### This PR Modify `BaseTextInputShadowNode::updateStateIfNeeded()` to update the state if base text attributes differ. On mount, the default font multiplier of NaN now differs from the real multiplier, so a state update occurs and the text field grows normally. Changelog: [iOS][Fixed] - Fix multiline TextInput not growing with its content when uncontrolled and initially empty Differential Revision: D127048714
|
@jasozh has exported this pull request. If you are a Meta employee, you can view the originating Diff in D127048714. |
This branch has not been deployed
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary:
Fixes an issue where on iOS, multiline expanding TextInputs do not expand if the input starts off as empty and uncontrolled.
Root Cause
When a multiline TextInput on iOS is provided a
valueandonChange()prop, as shown in the React Native docs, the input grows as expected. However, uncontrolled inputs do not grow past the first initial line.On mount,
BaseTextInputShadowNode::updateStateIfNeeded()writes state only if the text changes, so the first state write is skipped for empty, uncontrolled inputs. As a result,TextAttributeskeeps the defaultfontSizeMultiplier = NaNwhich is carried over since iOS copies the previous state for subsequent keystrokes. During measurement,attributedStringBoxToMeasure()sees that the current multiplier doesn't match the stored multiplier of NaN and falls back toprops.textwhich is empty for uncontrolled inputs. This causes the input to stay one-line tall.This PR
Modify
BaseTextInputShadowNode::updateStateIfNeeded()to update the state if base text attributes differ. On mount, the default font multiplier of NaN now differs from the real multiplier, so a state update occurs and the text field grows normally.Changelog: [iOS][Fixed] - Fix multiline TextInput not growing with its content when uncontrolled and initially empty
Differential Revision: D127048714