Skip to content

Commit

Permalink
Call setNativeView anytime node changes
Browse files Browse the repository at this point in the history
Summary:
changelog: [internal]

Call `AnimatedProps.setNativeView` any time `AnimatedProps` node changes to make sure it is always connected to underlaying host component.

Reviewed By: yungsters

Differential Revision: D41122065

fbshipit-source-id: 1d10fdd44933ff82d9bfc424cecb2640b7a66837
  • Loading branch information
sammy-SC authored and facebook-github-bot committed Nov 10, 2022
1 parent edc4ea0 commit 1b1b26a
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions Libraries/Animated/useAnimatedProps.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
): [ReducedProps<TProps>, CallbackRef<TInstance | null>] {
const [, scheduleUpdate] = useReducer<number, void>(count => count + 1, 0);
const onUpdateRef = useRef<?() => void>(null);
const cachedRef = useRef<TInstance | null>(null);

// TODO: Only invalidate `node` if animated props or `style` change. In the
// previous implementation, we permitted `style` to override props with the
Expand Down Expand Up @@ -64,6 +65,7 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
// NOTE: This may be called more often than necessary (e.g. when `props`
// changes), but `setNativeView` already optimizes for that.
node.setNativeView(instance);
cachedRef.current = instance;

// NOTE: This callback is only used by the JavaScript animation driver.
onUpdateRef.current = () => {
Expand Down Expand Up @@ -113,6 +115,16 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
);
const callbackRef = useRefEffect<TInstance>(refEffect);

useEffect(() => {
// Call `setNativeView` any time `node` changes to make sure
// `AnimatedProps._animatedView` is up to date.
// This would not be necessary in an ideal world.
// In React, anytime identity of function passed to `ref` changes,
// the old function is called with null and the new function is called with value.
// ScrollView does not behave like this and this workaround is necessary.
node.setNativeView(cachedRef.current);
}, [node]);

return [reduceAnimatedProps<TProps>(node), callbackRef];
}

Expand Down

0 comments on commit 1b1b26a

Please sign in to comment.