Как сделать FlatList прокручиваемым внутри ScrollView в React Native?

Я хочу создать FlatList внутри компонента ScrollView, но постоянно получаю сообщение об ошибке. VirtualizedLists никогда не должны вкладываться в простые ScrollViews с той же ориентацией, потому что это может нарушить работу с окнами и другие функции — вместо этого используйте другой контейнер, поддерживаемый VirtualizedList. Это привело меня к этой статье. Мне удалось изменить свой код, как показано ниже, но я не знаю, как изменить this.refs.myList.scrollProperties.offset, чтобы он соответствовал моему коду. Это лучший способ попробовать поместить FlatList в ScrollView или есть лучший способ?

const [enableScrollViewScroll, setEnableScrollViewScroll] = useState(true);

return (
  <View 
    onStartShouldSetResponderCapture={() => {
      setEnableScrollViewScroll(true);
    }}>
    <ScrollView 
      scrollEnabled={enableScrollViewScroll}>
      <Component/>
      <View
        onStartShouldSetResponderCapture={() => {
          setEnableScrollViewScroll(false);
          if (this.refs.myList.scrollProperties.offset === 0 && enableScrollViewScroll === false) {
            setEnableScrollViewScroll(true);
          }
        }}>
        <FlatList 
          data={myData}
          renderItem={({item}) => (
            <Text style = {{
              borderWidth: 1,
              marginTop: 5,
              borderRadius: 3,
              paddingLeft: 3,
            }}> 
              {item.content}
            </Text>
          )}/>
      </View>
    </ScrollView>
  </View>
);

person ErikT    schedule 25.06.2021    source источник


Ответы (1)


У меня была очень похожая проблема, пока я не наткнулся на почти полное решение в очень полезном комментарии к одной из проблем GitHub для реактивного проекта: https://github.com/facebook/react-native/issues/1966#issuecomment-285130701.

Проблема в том, что только родительский компонент регистрирует событие прокрутки. Решение состоит в том, чтобы контекстно решить, какой компонент должен фактически обрабатывать это событие, исходя из местоположения печатной машины.

Вам нужно будет немного изменить свою структуру, чтобы:

<View>
<ScrollView>
    <View>
        <FlatList/>
    </View>
    <View>
        <FlatList/>
    </View>
    <View>
        <FlatList/>
    </View>
    <View>
        <FlatList/>
    </View>
</ScrollView>
</View>

OR:

Мы можем использовать встроенную поддержку nestedscrollenabled для дочерних компонентов FlatList/ScrollView.

<FlatList nestedScrollEnabled />

This is only required for Android (Вложенная прокрутка поддерживается по умолчанию в iOS).

person xAtifx    schedule 25.06.2021