在手势检测器内调用函数时应用程序崩溃

问题描述 投票:0回答:1

我遇到的问题是,当尝试调用手势检测器内的函数时,我的应用程序不断崩溃。我看到了多个建议使用 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();
    }
}

我认为这应该足以理解我正在尝试做什么。

如果没有,请随时索要更多代码。

感谢任何帮助,并感谢您的时间:^)。

javascript react-native react-native-reanimated react-native-gesture-handler
1个回答
0
投票

我不确定你的 rollDown() 函数是什么样的,但我感觉问题就在那里。虽然 callRollDown() 是一个工作集,但如果 rollDown() 不是一个工作集,那么您在 UI 线程上调用它,这将导致崩溃。您可以将“worklet”添加到 rollDown(),或将该行更改为 runOnJS(rollDown)()。如果将 'worklet' 或 runOnJS 添加到 rollDown() 仍然不起作用,您可能需要在 Reanimated babel 插件中启用 processNestedWorklets。 这些文档应该可以帮助您做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.