react / react/react-native

Touchable focus events not triggering with keyboard (needed for accessibility)

Aperta
#45,252 7 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

API: Keyboard Issue: Author Provided Repro
Lingua principale
C++
Stelle
127k
Fork
25.3k
Merge medio
1g 23h
PR unite (30g)
4

Descrizione

Description

I am trying to add custom focus styles if a pressable is focused to make the keyboard focus visible in any case (dark/light mode, different background colors etc).

It seems like TouchableOpacity and TouchableHightlight both get forwarded from TouchableWithoutFeedback, which has the onFocus and onBlur events. I was trying to hold a focus state with these events to render styles dynamically. However, they do not get triggered at all, even if I use TouchableWithoutFeedback, which leads me to think that's the culprit.

Accessibility requires visibility of focus states. Is there another way to retrieve focus states?

Steps to reproduce

Here's a little example:

const [isFocused, setIsFocused] = useState(false);

return (
  // same with `TouchableWithoutFeedback` and `TouchableOpacity`
  <TouchableHighlight
    onFocus={() => setIsFocused(true)}
    onBlur={() => setIsFocused(false)}
    style={{
      backgroundColor: isFocused?"gray":"transparent",
    }}
  >
    ...
  </TouchableHighlight>
);
React Native Version

0.74.3

Affected Platforms

Runtime - Android

Output of npx react-native info
System:
  OS: macOS 14.5
  CPU: (12) arm64 Apple M2 Pro
  Memory: 109.05 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 20.13.1
    path: ~/Library/Caches/fnm_multishells/94190_1719818822541/bin/node
  Yarn: Not Found
  npm:
    version: 10.5.2
    path: ~/Library/Caches/fnm_multishells/94190_1719818822541/bin/npm
  Watchman:
    version: 2024.06.10.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /Users/d.timur/.rbenv/shims/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.5
      - iOS 17.5
      - macOS 14.5
      - tvOS 17.5
      - visionOS 1.2
      - watchOS 10.5
  Android SDK: Not Found
IDEs:
  Android Studio: 2023.2 AI-232.10300.40.2321.11668458
  Xcode:
    version: 15.4/15F31d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.11
    path: /opt/homebrew/opt/openjdk@17/bin/javac
  Ruby:
    version: 2.7.6
    path: /Users/d.timur/.rbenv/shims/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: 18.2.0
  react-native:
    installed: 0.74.2
    wanted: 0.74.2
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: false
iOS:
  hermesEnabled: true
  newArchEnabled: false
Stacktrace or Logs
-
Reproducer

https://github.com/proohit/focus-example

Screenshots and Videos

No response

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con il reproducer focus-example collegato e traccia il modo in cui TouchableHighlight, TouchableOpacity e TouchableWithoutFeedback gestiscono onFocus e onBlur su Android. Conferma il comportamento del focus della tastiera e definisci come completamento l’attivazione affidabile degli eventi di focus, in modo da poter eseguire il rendering di uno stile di focus visibile personalizzato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
react-native, typescript
Ambito
accessibility, mobile
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.