我应该在卸载时明确停止React Native动画吗?

时间:2019-12-19 17:44:37

标签: react-native react-animated

假设我从Animated.timing().start()开始制作动画,无论何时(在挂载或某些外部事件上)都没关系。然后,我使用Animated.View渲染动画。

假设它在卸载组件之前没有完成。

我应该在卸载时显式调用动画(实际上,所有仍在运行的动画)上的stop()还是隐式清除它?大多数手动分配的资源不会被隐式释放(除非它们像钩子一样被附加到组件上),但似乎就像动画一样。

2 个答案:

答案 0 :(得分:3)

我没有找到任何相关文档,但是浏览了我们所使用版本(0.59.8)的代码。

简短的回答是,不需要显式停止动画,它由React Native管理。

长答案在下面我的代码分析之后。

  • 当启动某个值的动画时,该动画将绑定到Animated.Value。 (以_animation_tracking的形式。)

  • Animated.Value上使用Animated.Component时,该值作为_propsAnimated附加到组件上。

  • 在componentWillUnmount _propsAnimated上进行__detach编辑,并且__detach上的Animated.Value通过调用Animated.Value.prototype.stopAnimation(这是一个公共函数)来停止动画。 Animated.Value)。

答案 1 :(得分:2)

好问题。我的拙见是-。正如您可能读过react-native docs一样,没有提及您应该这样做以及何时应该这样做。 如文档所述:

  

通过在动画上调用start()来启动动画。开始()   接受完成回调,当动画为   完成。如果动画正常运行完成,则完成   回调将使用{finished:true}进行调用。如果动画是   这样做是因为stop()在完成之前已被调用(例如   因为它被手势或其他动画打断了),那么它   将收到{完成:错误}。

由此,我想说的是,当卸载组件时,动画会中断。就个人而言,我没有在应用程序中使用stop(),也从未因此而面临过内存泄漏。如果您尝试更改start()回调函数中的组件状态,则可能会出现问题。这就是回调函数的finished属性出现的地方。额外参考here