我有以下代码在React Native
中制作动画Animated.timing(
this.state.absoluteChangeX,
{toValue: 0},
).start(function() {
this.lastX = 0;
this.lastY = 0;
});
非常简单,但无论何时触发,我都会收到错误:
singleValue.stopTracking is not a function
以下是错误发生的地方:
/react-native/Libraries/Animates/src/AnimtaedImplementation.js
var timing = function(
value: AnimatedValue | AnimatedValueXY,
config: TimingAnimationConfig,
): CompositeAnimation {
return maybeVectorAnim(value, config, timing) || {
start: function(callback?: ?EndCallback): void {
var singleValue: any = value;
var singleConfig: any = config;
singleValue.stopTracking(); // <--------------- HERE!!!
if (config.toValue instanceof Animated) {
singleValue.track(new AnimatedTracking(
singleValue,
config.toValue,
TimingAnimation,
singleConfig,
callback
));
} else {
singleValue.animate(new TimingAnimation(singleConfig), callback);
}
},
stop: function(): void {
value.stopAnimation();
},
};
};
我不是非常精通typeScript,但是var singleValue: any
意味着“singleValue”可以是任何类型。就我而言,这是一个数字。由于数字没有方法,因此这是错误的。
我做错了吗?
答案 0 :(得分:66)
您希望设置动画的值必须是Animated.Value
的实例或其子类型之一。初始化状态时,它看起来应该是这样的:
getInitialState() {
return { absoluteChangeX: new Animated.Value(0) };
}
框架方法中的类型声明是any
的事实只是缺少约束,而不是将任何值传递给它的明确邀请。
有关更多示例,请参阅Animated docs。
答案 1 :(得分:0)
当我忘记将变量设置为引用的 .current
时,有时会遇到这个问题(而是使用 React 钩子):
function MyComponent() {
const animatedValue = useRef(new Animated.Value(0.0)).current; // Notice the .current
}
这可能不一定能回答最初的问题,但在使用 React hooks 时遇到此错误的开发人员可能会在这里结束,所以也许它会对某人有所帮助。
答案 2 :(得分:0)
我遇到了这个问题,因为我使用了动画值 (2)
而不是对象 (1)
:
const animatedValue = useRef(new Animated.Value(0.0)).current; // (1)
const transform = animatedValue.interpolate({
inputRange: [0.0, 1.0],
outputRange: [0, 100]
}); // (2)
Animated.timing(animatedValue, { // USE animatedValue, NOT transform HERE!
toValue: 1.0,
duration: 3000,
});
希望这可以帮助任何不熟悉 React Native Animation 的人(比如我:))...