Добавление данных в единый список в react native Web с сохранением видимого содержимого

#react-native-flatlist #react-native-web #flatlist

#react-native-плоский список #react-native-web #плоский список

Вопрос:

Возможно ли реализовать плоский список с помощью react native web, в котором вы добавляете данные, сохраняя видимое содержимое?

Прямо сейчас он переходит в начало плоского списка, когда вы добавляете что-либо. Я использую onContentSizeChange принудительное перемещение позиции прокрутки после обновления, но это ужасно, так как иногда перед обновлением возникает огромная задержка. Проверьте этот пробел, чтобы понять, что я имею в виду: https://snack.expo.io/@divone/prepend-data-to-flatlist-on-web

Был ли кто-нибудь успешным в реализации плоского списка, подобного чату, с помощью React Native Web? Если да, то как этого добиться?


РЕДАКТИРОВАТЬ: я обнаружил, что в react native Web видимость содержимого автоматически сохраняется при добавлении данных ТОГДА И ТОЛЬКО ТОГДА, КОГДА полоса прокрутки не находится в верхней части экрана. (перекус)

Итак, мой вопрос все еще остается в силе… как добавить данные и сохранить видимость, даже если полоса прокрутки прокручивается до упора?

Комментарии:

1. Проверьте это: github.com/FaridSafi/react-native-gifted-chat/issues /…

2. к вашему сведению, onContentSizeChange ненадежен. он перестанет обновляться после увеличения размера до определенного числа из-за оптимизации для больших плоских списков, и в итоге дельта будет равна 0. кроме того, изменение может быть вызвано несколько раз во время одного добавления.

3. @Prasanth да, у меня было много проблем с onContentSizeChange, поэтому я определенно ищу альтернативу.

4. @SKarpov Я уже пробовал это решение. В итоге я получаю чрезвычайно жесткую прокрутку (по сравнению с плавной прокруткой, которую вы обычно получаете). Имо, на самом деле это невозможно использовать в готовом продукте…

Ответ №1:

Вы можете инвертировать свой плоский список, а затем также изменить представление данных. Я имею в виду, что когда вы меняете направление плоского списка, вы добавляете данные в его конец, и тогда никакого перехода не происходит. Я изменяю ваш общий код и вставляю его ниже, чтобы было понятно, что я сказал, надеюсь, это поможет:

 import * as React from 'react';
import { Text, View, Button, FlatList } from 'react-native';

let lastContentHeight = 0;
let lastY = 0;

export default function App() {
const [data, setdata] = React.useState([]);

const flatlist = React.useRef();

const addData = React.useCallback(() => {
    const first =  data.length ? data[data.length-1].key : 1;
    const newArray = [];
    for (let i = first ; i <first  15; i  ) {
        newArray.push({ key: i });
    }
    setdata([ ...data,...newArray]);
}, [data]);

React.useEffect(() => {
    addData();
}, []);

// const onContentSizeChange = (contentWidth, contentHeight) => {
//  const delta = contentHeight - lastContentHeight;
//  const newY = lastY   delta;
//  flatlist.current.scrollToOffset({ animated: false, offset: newY });
//  lastY = newY;
//  lastContentHeight = contentHeight;
// };

const onScroll = ({
    nativeEvent: {
        contentOffset: { y },
    },
}) => {
    lastY = y;
};

return (
    <View style={{ height: 600 }}>
        <Button onPress={addData} title="Prepend data" />
        <FlatList
  inverted
            ref={flatlist}
            data={data}
            renderItem={({ item }) => <Text style={{ padding: 80 }}>{item.key}</Text>}
            // onContentSizeChange={onContentSizeChange}
            onScroll={onScroll}
        />
    </View>
);
  

}

Комментарии:

1. К сожалению, inverted плохо работает в Интернете. Прокрутка колесика мыши также становится инвертированной (по крайней мере, в Chrome). Кроме того, я хотел бы знать, как добавлять данные в целом, независимо от того, означает ли добавление добавления в верхнюю (обычную) или нижнюю (перевернутую) часть экрана.