React Native FlatList onViewableItemsChanged 回调在状态更改重新渲染后遇到错误

Maj*_*nia 5 reactjs react-native react-native-flatlist

我需要设置状态来检测当前视口中的哪个项目可见。为此,我编写以下代码:

const [inViewPort, setInViewPort] = useState(0);

const viewabilityConfig = {
  viewAreaCoveragePercentThreshold: 30,
};

const onViewableItemsChanged = ({viewableItems, changed}) => {
  if (changed && changed.length > 0) {
    setInViewPort(changed[0].index);
  }
};

return (
  <SafeAreaView style={styles.container}>
    <FlatList
      data={myData}
      renderItem={renderItem}
      showsHorizontalScrollIndicator={false}
      keyExtractor={(_, index) => index.toString()}
      horizontal={true}
      onViewableItemsChanged={onViewableItemsChanged}
      viewabilityConfig={viewabilityConfig}
    />
  </SafeAreaView>
);
Run Code Online (Sandbox Code Playgroud)

onViewableItemsChanged 事件回调正确触发,但在我调用 setInViewPort 后,组件更新并重新呈现以下错误:

违反不变性:不支持动态更改 onViewableItemsChanged

在此输入图像描述

小智 8

我一直在寻找相同的答案,但任何地方都没有明确的例子。我就是这样解决的。

const [inViewPort, setInViewPort] = useState(0)

const viewabilityConfig = useRef({
  itemVisiblePercentThreshold: 50,
  waitForInteraction: true,
  minimumViewTime: 5,
})

const onViewableItemsChanged = React.useRef(({ viewableItems, changed }) => {
  if (changed && changed.length > 0) {
    setInViewPort(changed[0].index);
  }
})

return (
  <SafeAreaView style={styles.container}>
    <FlatList
      data={myData}
      renderItem={renderItem}
      showsHorizontalScrollIndicator={false}
      keyExtractor={(_, index) => index.toString()}
      horizontal={true}
      onViewableItemsChanged={onViewableItemsChanged.current}
      viewabilityConfig={viewabilityConfig.current}
    />
  </SafeAreaView>
)
Run Code Online (Sandbox Code Playgroud)