我遇到的问题是,当尝试调用手势检测器内的函数时,我的应用程序不断崩溃。我看到了多个建议使用 runOnJS 或在所需函数中编写工作集的答案,似乎很多人都可以用它解决他们的问题,但这些都不适合我。也许你们中的某个人可以弄清楚我的问题是什么......
我的代码片段:
const SortingModal = React.forwardRef(({rollDown},ref) => {
const {height: MAX_MODAL_HEIGHT} = Dimensions.get('screen');
const translateY = useSharedValue(0);
const context = useSharedValue({y: 0});
const gesture = Gesture.Pan()
.onStart(()=>{
context.value ={ y: translateY.value};
})
.onUpdate((event) => {
if(event.translationY < MAX_MODAL_HEIGHT){
translateY.value = event.translationY + context.value.y;
translateY.value = Math.max(translateY.value, -MAX_MODAL_HEIGHT)
}
}).onEnd(()=>{
if(translateY.value > -MAX_MODAL_HEIGHT*0.5){
translateY.value = withSpring(0, {damping: 15});
callRollDown(); //My function, also tried runOnJS(callRollDown)()
}else{
translateY.value = withSpring(-MAX_MODAL_HEIGHT, {damping: 15});
}
});
const rBottomSheetStyle = useAnimatedStyle(() => {
return {
transform: [{translateY:translateY.value}]
};
},[translateY]);
const callRollDown = () =>{
'worklet'
rollDown();
}
}
我认为这应该足以理解我正在尝试做什么。
如果没有,请随时索要更多代码。
感谢任何帮助,并感谢您的时间:^)。
我不确定你的 rollDown() 函数是什么样的,但我感觉问题就在那里。虽然 callRollDown() 是一个工作集,但如果 rollDown() 不是一个工作集,那么您在 UI 线程上调用它,这将导致崩溃。您可以将“worklet”添加到 rollDown(),或将该行更改为 runOnJS(rollDown)()。如果将 'worklet' 或 runOnJS 添加到 rollDown() 仍然不起作用,您可能需要在 Reanimated babel 插件中启用 processNestedWorklets。 这些文档应该可以帮助您做到这一点。