TextInput `setSelection` "ignored" when TextInput has gone out of focus
还没有人认领这个 Issue。
- 主要语言
- C++
- 星标
- 127k
- 派生
- 25.3k
- 平均合并
- 1 天 23 小时
- 30 天内合并 PR
- 4
描述
Description
When assigning a ref to TextInput there is a setSelection method, which in general works great for changing the selection of the input, without needing to set a selection prop.
However, on android, there is an edge case where when the TextInput has gone out of focus while calling setSelection the new selection is ignored.
See this video, where we have simple code that adds an emoji in the place of the selection:
Now we changed the code a bit and the TextInput will actually lose focus while we are changing the text. You can see that the selection is wrong. We said the selection to have a range of 0, but it still has the previous range:
I see how I could fix this by using a selection prop. But this would cause other issues. I could see how I can hack my way around it by further waiting before I call setSelection, however, this can create UI glitches.
I would just assume it to work when I called setSelection.
On iOS something similar can be observed. Here the selection cursor gets set to the end (although onSelectionChange isn't reporting necessarily a change, there is one):
Version
0.70.3
Output of npx react-native info
System:
OS: macOS 12.6
CPU: (20) x64 Intel(R) Core(TM) i9-10910 CPU @ 3.60GHz
Memory: 480.50 MB / 48.00 GB
Shell: 5.8.1 - /bin/zsh
Binaries:
Node: 16.15.1 - ~/.nvm/versions/node/v16.15.1/bin/node
Yarn: 1.22.19 - ~/.nvm/versions/node/v16.15.1/bin/yarn
npm: 8.11.0 - ~/.nvm/versions/node/v16.15.1/bin/npm
Watchman: 2022.09.26.00 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.11.3 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: DriverKit 21.4, iOS 16.0, macOS 12.3, tvOS 16.0, watchOS 9.0
Android SDK:
API Levels: 26, 28, 29, 30, 31, 32
Build Tools: 26.0.3, 28.0.3, 29.0.2, 29.0.3, 30.0.2, 30.0.3, 31.0.0, 32.0.0, 33.0.0
System Images: android-26 | Google APIs Intel x86 Atom_64, android-27 | Google Play Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-30 | ARM 64 v8a, android-30 | Google APIs Intel x86 Atom, android-30 | Google Play Intel x86 Atom
Android NDK: 21.4.7075529
IDEs:
Android Studio: Dolphin 2021.3.1 Patch 1 Dolphin 2021.3.1 Patch 1
Xcode: 14.0.1/14A400 - /usr/bin/xcodebuild
Languages:
Java: javac 17 - /usr/bin/javac
npmPackages:
@react-native-community/cli: Not Found
react: 18.1.0 => 18.1.0
react-native: 0.70.3 => 0.70.3
react-native-macos: Not Found
npmGlobalPackages:
*react-native*: Not Found
Steps to reproduce
- Clone the repository
- Run
yarn - Run
yarn android - When the app opens, click inside the TextInput and select any text
- Then click on "Open emoji modal"
- Click on "Add emoji"
Important note: I assume this bug is a race condition as it doesn't happen 100% of the time you try!
Snack, code example, screenshot, or link to a repository
https://github.com/hannojg/TextInputSetSelectionReproduction
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 https://github.com/hannojg/TextInputSetSelectionReproduction 中的复现仓库开始。按照列出的 yarn、Android、TextInput、emoji modal 和 Add emoji 步骤操作,然后比较失去焦点时 Android 和 iOS 的行为。完成的标准是:文本发生变化后,setSelection 能可靠地应用请求的范围,包括报告的失去焦点场景。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- react-native
- 领域
- mobile
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 35/100