mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Deduct offset from getValue result when detaching
Summary: The NativeAnimated `getValue` API returns `value + offset`: Android: iOS: https://github.com/facebook/react-native/blob/main/Libraries/NativeAnimation/Nodes/RCTValueAnimatedNode.m#L44 Android: https://github.com/facebook/react-native/blob/main/ReactAndroid/src/main/java/com/facebook/react/animated/ValueAnimatedNode.java#L36 When we store the value after detaching the NativeAnimated node, it stores the result of the NativeAnimated `getValue` call to the `_value` property, so if we call `__getValue` at some later point on the `AnimatedValue`, we will count the offset twice. This change deducts the offset value from the result returned from `getValue` when storing the latest value. Changelog: [General][Fixed] - AnimatedValue.__detach should store getValue result with offset deducted Reviewed By: yungsters Differential Revision: D32987003 fbshipit-source-id: 488d1fe512f886c7a9de1e5a4de8f19441ebd81e
This commit is contained in:
committed by
Facebook GitHub Bot
parent
c034b7e7e1
commit
fe53cae954
@@ -134,6 +134,28 @@ describe('Native Animated', () => {
|
||||
expect(opacity.__getValue()).toBe(1);
|
||||
});
|
||||
|
||||
it('should deduct offset when saving value on unmount', () => {
|
||||
NativeAnimatedModule.getValue = jest.fn((tag, saveCallback) => {
|
||||
// Assume current raw value of value node is 0.5, the NativeAnimated
|
||||
// getValue API returns the sum of raw value and offset, so return 1.
|
||||
saveCallback(1);
|
||||
});
|
||||
const opacity = new Animated.Value(0);
|
||||
opacity.setOffset(0.5);
|
||||
opacity.__makeNative();
|
||||
|
||||
const root = TestRenderer.create(<Animated.View style={{opacity}} />);
|
||||
const tag = opacity.__getNativeTag();
|
||||
|
||||
root.unmount();
|
||||
|
||||
expect(NativeAnimatedModule.getValue).toBeCalledWith(
|
||||
tag,
|
||||
expect.any(Function),
|
||||
);
|
||||
expect(opacity.__getValue()).toBe(1);
|
||||
});
|
||||
|
||||
it('should extract offset', () => {
|
||||
const opacity = new Animated.Value(0);
|
||||
opacity.__makeNative();
|
||||
|
||||
@@ -100,7 +100,7 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
__detach() {
|
||||
if (this.__isNative) {
|
||||
NativeAnimatedAPI.getValue(this.__getNativeTag(), value => {
|
||||
this._value = value;
|
||||
this._value = value - this._offset;
|
||||
});
|
||||
}
|
||||
this.stopAnimation();
|
||||
|
||||
Reference in New Issue
Block a user