Shopify / Shopify/react-native-skia
iOS Fabric: first tap on a Touchable is lost while keyboard is open — regression between 2.2.12 and 2.4.21, still present in 2.11.0
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 8.6k
- Forks
- 647
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 35
Description
Description
On a real device (iPhone 14 Pro, iOS 26.3.1, RN 0.81.x, New Architecture/Fabric), after using the app for a while, the first tap on a TouchableOpacity (send button) next to a focused multiline TextInput is silently consumed while the software keyboard is open: the keyboard closes, but the button's Pressability never fires (onPressIn/onPress are not reached). The second tap works. The Skia canvas lives on a different screen — the symptom occurs on a screen with no canvas mounted, after the canvas screen was used earlier in the session.
Bisection (device A/B, each configuration soak-tested with prolonged real usage)
| Configuration | Result |
|---|---|
| App @ commit before Skia upgrade (Skia 2.2.12) | no repro |
Same commit + only @shopify/react-native-skia 2.2.12 → 2.4.21 |
repro |
| Latest app + Skia 2.11.0 (latest) | repro |
| Latest app + Skia pinned to 2.2.12 | no repro |
Downgrading react-native 0.81.6 → 0.81.5 did not help, so it does not look RN-version specific.
Notes
- Diffing the package's
apple/andcpp/sources between 2.2.12 and 2.4.21 shows no touch/gesture/recognizer changes, so we suspect a rendering/threading timing change surfaces a React Native Fabric responder negotiation issue rather than a direct touch-handling bug. - During diagnosis we observed the JS ResponderEventPlugin's
trackedTouchCountbeing left at 1 after a batchedtopTouchCancel: twotopTouchStartevents followed by a singletopTouchCancelwhosenativeEvent.touches.lengthis 0 (the plugin decrements only once per cancel event). After that,topSelectionChangelets the focused TextInput become responder, and the next tap on the button is never granted the responder. - Environment: react-native 0.81.5/0.81.6, react-native-gesture-handler ~2.28, react-native-reanimated ~4.1, react-native-worklets 0.5.1–0.7.4, react-native-keyboard-controller ^1.21.7, Expo SDK 54,
newArchEnabled: true.
We don't have a minimal reproduction yet (it needs prolonged usage to trigger), but we can provide more details or run instrumented builds if helpful.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the apple/ and cpp/ source changes between Skia 2.2.12 and 2.4.21, then trace the JS ResponderEventPlugin around trackedTouchCount, topTouchCancel, and topSelectionChange. Use an instrumented real-device build with prolonged usage to reproduce the event sequence. Done means the first tap reaches TouchableOpacity Pressability while the keyboard is open, without regressing the older Skia behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, ios, react-native, typescript
- Domain
- computer-graphics, frontend, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 42/100