[Android/Fabric] setPageWithoutAnimation from useLayoutEffect is ignored when targeting a newly added page
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 58/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- android, react-native, typescript
- Ambito
- mobile
Direzione di ricerca
Start with the reproduction source’s App.tsx and the Android implementation of PagerView’s setPageWithoutAnimation command; trace how the command is handled when children are added. Compare the reported retry behavior with the command-only deferred patch in the archive. Done means the first request selects page D after adding pages, without a retry, and the existing pager behavior remains intact.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
Calling setPageWithoutAnimation(3) from useLayoutEffect immediately after expanding the pager from one page to four can leave the pager on page 0.
I reproduced this on a physical Android device using a standalone app with synthetic pages. The pager remains on page A for more than five seconds after requesting page D. Repeating the same command afterward switches to D successfully.
Environment
- react-native-pager-view: 9.0.7
- React Native: 0.88.0
- React: 19.3.0
- Architecture: Fabric
- Device: V2509A, physical device, arm64-v8a
- Android: 16 / API 36
- Build: Android debug native build with bundled JS (
dev=false), developer support disabled, no Metro connection
The baseline uses pager-view 9.0.7 with diagnostic logging only, without behavior-changing pager patches.
Steps to reproduce
- Render a
PagerViewcontaining only page A, withinitialPage={0}. - Wait for a nonzero layout and the initial
onPageSelectedevent reporting index 0. - Press Add pages & select D. This appends pages B, C, and D.
- In the
useLayoutEffectassociated with that update, callsetPageWithoutAnimation(3). - Observe that the pager remains on A.
- Wait several seconds, then press Retry select D, which repeats the same command without changing the children.
- The pager now switches to D and reports index 3.
The relevant update logic is:
const pager = useRef<PagerView>(null);
const [count, setCount] = useState(1);
useLayoutEffect(() => {
if (count === 4) {
pager.current?.setPageWithoutAnimation(3);
}
}, [count]);
// "Add pages & select D"
setCount(4);
// "Retry select D"
pager.current?.setPageWithoutAnimation(3);
The rendered children are PAGES.slice(0, count), with stable keys and collapsable={false}. The pager has a fixed positive height. No artificial mounting delays are introduced.
Expected behavior
The command selects the newly added page D once the corresponding child update has mounted, without requiring another command.
Actual behavior and device recording
https://github.com/user-attachments/assets/e859a058-98a2-4598-9d10-8374c806d5b8
In the baseline recording:
- At approximately 3.10 seconds, the React child count becomes 4 and the requested index is 3 (D), but the visible page and last
onPageSelectedvalue remain A / 0. - This mismatch persists for approximately 5.5 seconds.
- After pressing Retry select D, the visible page changes to D at approximately 8.58 seconds, and
onPageSelectedreports index 3 at approximately 8.60 seconds.
The “React children” counter reflects the React render state; it does not measure the number of children already mounted natively.
Command-only comparison
https://github.com/user-attachments/assets/77a4eb37-794d-4da9-ba99-dcec21c77830
I also tested a local change that defers command processing with View.post and validates the target index when the deferred command runs.
With that change, the same operation on the same device reaches D without pressing Retry. The comparison does not include measurement, page identity, or reattachment changes.
This supports a possible command-versus-child-mount timing issue. However, I could not obtain useful native logs from the device, so the exact native dispatch order has not been directly confirmed. The comparison demonstrates a fix for this reproduction, rather than establishing a complete solution for all command-ordering cases.
These recordings specifically test setPageWithoutAnimation; animated setPage was not tested on the device.
Reproduction source
The archive includes the tested App.tsx, build instructions, and the command-only comparison patch. Its README documents the build setup and verification scope.
- Lingua principale
- TypeScript
- Stelle
- 3.4k
- Fork
- 490
- Merge medio
- 2g 5h
- PR unite (30g)
- 34
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di callstack/react-native-pager-view
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 67/100
callstack/react-native-pager-view#1205 ·
I maintainer di solito rispondono entro 1 giorno
-
[iOS] Page is blank after setPage when the screen re-renders on pager eventsForse già presa @KisaneNeko l’ha presa 2 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
callstack/react-native-pager-view#1202 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
[iOS] Focused TextInput keeps focus and keyboard after switching pages (v9)Forse già presa @TaduJR l’ha presa 9 giorni fa. Aperta
Difficoltà 4/5 1-2 giorni Idoneità per principianti 69/100
callstack/react-native-pager-view#1192 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 73/100
callstack/react-native-pager-view#1191 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
callstack/react-native-pager-view#1189 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di callstack/react-native-pager-view
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
vekexasia/pi-extensible-workflows#374 ·
I maintainer di solito rispondono entro 2 giorni
-
documentation good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
I maintainer di solito rispondono entro 1 giorno
-
help wanted linux
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
GiuseppeBellamacina/downtime#19 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
scaleway/ultraviolet#7089 ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
Get-Concord-AI/concord-mcp#296 ·
I maintainer di solito rispondono entro 1 giorno