Nik*_*son 3 react-native react-native-reanimated react-native-gesture-handler react-native-reanimated-v2
有一些手势处理程序可以在浏览器中正常工作,但我在 iOS 上的 useAnimatedGestureHandler 挂钩的 onEnd 回调中收到此错误。
这是与我尝试添加的手势相关的所有代码
const headerHeight = useSharedValue(176)
const outerStyle = useAnimatedStyle(() => ({
minHeight: 176,
maxHeight: 416,
height: headerHeight.value,
borderBottomLeftRadius: 20,
borderBottomRightRadius: 20,
position: 'relative',
overflow: 'visible',
zIndex: 502,
}))
const innerStyle = useAnimatedStyle(() => ({
overflow: 'hidden',
height: headerHeight.value,
minHeight: 176,
maxHeight: 416,
borderBottomLeftRadius: 20,
borderBottomRightRadius: 20,
}))
const resizeHeaderHeight = useAnimatedGestureHandler({
onStart: () => {},
onActive: (event) => {
headerHeight.value = event.absoluteY
},
onEnd: () => {
if(headerHeight.value < 305) {
headerHeight.value = withTiming(176, {
duration: 500,
})
setHeaderExpanded(false)
} else {
headerHeight.value = withTiming(416, {
duration: 500,
})
setHeaderExpanded(true)
}
},
})
return <>
<PanGestureHandler onGestureEvent={resizeHeaderHeight}>
<Animated.View style={outerStyle}>
<Animated.View style={innerStyle}>
<HeaderComponent
expandable={true}
hideContentCollapsed={false}
onClickExpand={() => {
// setHeaderExpanded(!headerExpanded)
}}
onClickTitle={openMonthPicker}
>{{
title: <Title />,
content: <HeaderCalendar />,
buttons: [
<RefreshButton key='refresh' />,
<AssignmentOffersButton key='assignment-offers' navigation={navigation} />,
<FiltersButton key='filters' navigation={navigation} />,
],
}}</HeaderComponent>
</Animated.View>
<ExpandButton isExpanded={headerExpanded} onClick={()=> {}} />
</Animated.View>
</PanGestureHandler>
{headerExpanded && <Overlay onClick={() => {
setHeaderExpanded(!headerExpanded)
}} />}
</>
}
export default observer(Header)
Run Code Online (Sandbox Code Playgroud)
已尝试将 onEnd 定义为“worklet”并使用建议的 runOnJs 函数来解决此问题,但我不确定我是否正确执行,因为每次 onEnd 运行时我仍然遇到错误。
很抱歉回复晚了。我认为,正如您已经提到的,问题在于不使用 runOnJS。基本上,onStart、onActive 和 onEnd 是成熟的工作集,即将在 UI 线程上执行的 javascript 函数。因此,如果您的函数只能在 javascript 线程上执行并且需要从工作集启动,则必须始终使用 runOnJS 指定它。
更具体地说,在 onEnd 函数中,您应该像这样包装 setHeaderExpanded 函数:
runOnJS(setHeaderExpanded)(true) // the boolean value you want to use.
| 归档时间: |
|
| 查看次数: |
6949 次 |
| 最近记录: |