如何修复React Native中NativeAnimatedModule的回调泄漏错误
解决React Native中"Excessive number of pending callbacks"错误
这个错误是由于NativeAnimatedModule的异步回调未被正确清理,导致大量回调挂起,进而影响页面导航性能。结合你安装的react-native-share和react-native-view-shot库,可按以下步骤排查解决:
1. 校验库版本兼容性
- 运行
npm list react-native-share react-native-view-shot查看当前库版本,确认其与你的React Native版本兼容(可参考两个库的官方README中的版本适配说明)。 - 若版本不匹配,执行
npm install react-native-share@适配版本 react-native-view-shot@适配版本进行升级或降级。
2. 手动清理未终止的动画回调
页面卸载时务必停止所有Native Animated动画,避免回调泄漏:
import { Animated, useEffect } from 'react-native'; const YourComponent = () => { const fadeAnim = useRef(new Animated.Value(0)).current; useEffect(() => { const animation = Animated.timing(fadeAnim, { toValue: 1, duration: 1000, useNativeDriver: true, }); animation.start(); // 组件卸载时终止动画 return () => { animation.stop(); }; }, [fadeAnim]); return <Animated.View style={{ opacity: fadeAnim }} />; };
- 检查项目中所有使用
Animated的代码,确保导航离开页面时相关动画都已停止。
3. 规范react-native-view-shot的使用
使用视图捕获功能时,确保资源正确释放:
import { useRef, useEffect } from 'react'; import ViewShot from 'react-native-view-shot'; const CaptureComponent = () => { const viewShotRef = useRef(null); useEffect(() => { return () => { // 组件卸载时释放捕获资源 if (viewShotRef.current) { viewShotRef.current.release?.(); } }; }, []); const capture = async () => { const uri = await viewShotRef.current.capture(); // 处理捕获结果后无需保留资源 }; return <ViewShot ref={viewShotRef} />; };
- 避免在滚动、页面切换等高频触发事件中重复调用捕获方法,可添加防抖逻辑减少不必要的异步任务。
4. 定位泄漏根源
- 打开React Native调试菜单(iOS:Cmd+D,Android:Cmd+M),开启"Debug JS Remotely",在Chrome DevTools的Memory面板生成堆快照,搜索
NativeAnimatedModule相关对象,定位未被释放的回调。 - 在动画的
start和stop方法中添加console.log,确认每个startAnimatingNode都有对应的终止回调被执行。
5. 清理缓存并重建项目
- 重置React Native缓存:
npx react-native start --reset-cache - iOS端清理Pod缓存:
cd ios pod deintegrate pod install - Android端清理构建缓存:
cd android ./gradlew clean - 重新运行项目,验证错误是否消失。
6. 临时禁用动画(排查用)
若以上方法无效,可临时禁用Native Animated验证问题根源:
import { NativeAnimatedHelper } from 'react-native'; // 在App.js入口处添加 NativeAnimatedHelper.setAnimationEnabled(false);
- 禁用后若错误消失,说明问题出在动画相关代码(包括第三方库中的动画实现),需针对性排查。
内容的提问来源于stack exchange,提问作者putu eka mulyana
相关产品推荐
相关产品推荐

