react / react/react-native

TextInput `setSelection` "ignored" when TextInput has gone out of focus

Ouverte
#35,005 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Component: TextInput Needs: Triage :mag: Never gets stale
Langage dominant
C++
Étoiles
127k
Forks
25.3k
Merge moyen
1 j 23 h
PR mergées (30 j)
4

Description

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:

https://user-images.githubusercontent.com/16821682/196180861-27adfd53-41da-4a76-8c5b-f69b0889e43f.mov

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:

https://user-images.githubusercontent.com/16821682/196181111-91472e22-f28d-4854-8c31-afe46bde403c.mov

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):

https://user-images.githubusercontent.com/16821682/196187268-7d14c6da-8269-4156-b5a1-12473ae9add5.mov

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le dépôt de reproduction à l’adresse https://github.com/hannojg/TextInputSetSelectionReproduction. Suivez les étapes indiquées pour yarn, Android, TextInput, emoji modal et Add emoji, puis comparez le comportement d’Android et d’iOS lorsque le focus est perdu. C’est terminé lorsque setSelection applique de manière fiable la plage demandée après la modification du texte, y compris dans le cas signalé de perte de focus.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
react-native
Domaine
mobile
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.