fix input field in the wrong place when backgrounding an app for a while
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
# react-native-reanimated@4.3.2.patch
|
||||
|
||||
Contains two independent changes:
|
||||
|
||||
1. Backport of PR 9901 (`LayoutAnimation.configureNext` compatibility)
|
||||
2. Backport of PR 9527 plus an eviction guard in `AnimatedPropsRegistry`
|
||||
(stale `settledProps` applied after app resume)
|
||||
|
||||
## 1. Backport of PR 9901
|
||||
|
||||
Backport of https://github.com/software-mansion/react-native-reanimated/pull/9901
|
||||
("refactor(LayoutAnimations): stop taking over UIManagerAnimationDelegate").
|
||||
|
||||
@@ -20,3 +28,34 @@ Only the `packages/react-native-reanimated` part of the PR is included (the
|
||||
`apps/fabric-example` hunk is not part of the published package), and the
|
||||
include hunk in `LayoutAnimationsProxy_Legacy.cpp` was adjusted to the 4.3.2
|
||||
release sources.
|
||||
|
||||
## 2. Stale `settledProps` after app resume (AnimatedPropsRegistry)
|
||||
|
||||
Backport of https://github.com/software-mansion/react-native-reanimated/pull/9527
|
||||
("Fix stale settledProps on worklet re-animation") plus an additional eviction
|
||||
guard on top of it. Fixes the Android DM composer "phantom jump"
|
||||
(https://github.com/software-mansion/react-native-reanimated/issues/9574).
|
||||
|
||||
Background: with `FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS`, once an
|
||||
animation settles its final props are handed to JS (polled every 500 ms by
|
||||
`PropsRegistryGarbageCollector`) and stored in React component state
|
||||
(`settledProps`). The native registry entry is then evicted ~2 s after the
|
||||
last worklet write, at which point `ReanimatedCommitHook` no longer covers the
|
||||
view and the React-side snapshot becomes the sole owner of the value.
|
||||
|
||||
The PR 9527 part adds `syncedTags_` / `invalidatedTags_` so that when a
|
||||
previously-synced view re-animates, its now-stale React snapshot is refreshed
|
||||
on the next GC tick instead of waiting up to ~1.5 s for the new value to
|
||||
settle.
|
||||
|
||||
The additional guard fixes the handoff itself. Upstream, eviction relies on a
|
||||
timing assumption: the settled value is returnable between 1 s and 2 s of age,
|
||||
and a 500 ms JS timer is assumed to tick inside that window. If no tick lands
|
||||
there (app backgrounded while a keyboard-driven animation finishes, JS thread
|
||||
blocked for >1 s), the first tick after resume destroys the entry inside
|
||||
`getUpdatesOlderThanTimestamp` *before* the collection loop can return it -
|
||||
the settled value is lost, React state keeps the pre-background value, and the
|
||||
next React commit snaps the view back (the phantom jump). The guard makes
|
||||
`removeUpdatesOlderThanTimestamp` only evict tags present in `syncedTags_`,
|
||||
i.e. values that were actually handed to JS; an unsynced stale entry survives
|
||||
one more tick, gets returned as settled, and is evicted on the following tick.
|
||||
|
||||
Reference in New Issue
Block a user