0

我的 App.js 中有以下代码:

  1. 主要的refFlatList 设置在一个useEffect钩子中flatListRef
const [flatListRef, setFlatListRef] = useState(null);
...
useEffect(() => {
    let mounted = true;
    if (refSlides?.current && mounted) setFlatListRef(refSlides.current);
    return () => mounted = false;
}, []);
  1. renderItem所需组件呈现为 FlatList 的一项的函数
const renderItem = ({item, index, separators}) => {
    return (
        <View style={{
            flexGrow: 1,
            width,
            height
        }}>
            {
                item.component === 'Welcome' && <Welcome/>
                || item.component === 'Hospital' &&
                <Hospital
                    flatListRef={flatListRef}
                    history={navHistory}
                    slides={slides}
                    setSlides={setSlides}
                    slide={item}/>
                || item.component === 'Snippets' &&
                <Snippets
                    flatListRef={flatListRef}
                    history={navHistory}
                    slides={slides}
                    setSlides={setSlides}
                    slide={item}
                />
                || item.component === 'Disease' &&
                <Disease
                    flatListRef={flatListRef}
                    history={navHistory}
                    slides={slides}
                    setSlides={setSlides}
                    slide={item}
                />
            }
        </View>
    );
};
  1. 实际的 FlatList 定义
<FlatList
    data={slides}
    ref={refSlides}
    keyExtractor={item => item.key.toString()}
    renderItem={renderItem}
    getItemLayout={(data, index) => {
        return {
            length: width,
            offset: width * index,
            index
        };
    }}
    horizontal={true}
    showsHorizontalScrollIndicator={false}
    pagingEnabled={true}
/>

我的任何Welcome, Hospital, Snippets,Disease组件中都有以下代码。例如:

<TouchableOpacity
    activeOpacity={0.8}
    onPress={() => {
        setSlides([...slides, {
            key: uuidC.v4(),
            index: slides.length,
            uuid: item.uuid,
            component: 'Hospital'
        }]);
        flatListRef.scrollToIndex({index: slides.length - 1}); // <===== HERE IS THE PROBLEM
    }}>
    ...
</TouchableOpacity>

我有一个主要的 FlatList,它在开始时有 2 个组件,Welcome索引为 0 的Hospital组件和索引为 1 的组件。在Hospital组件中,我有按钮,当它们被按下时,将另一个项目(Hospital、、、Disease)添加Snippets到 FlatList。项目添加成功,我可以手动滑动到它们。

当我尝试自动滚动到最后添加的项目时出现问题。我想要以下行为:按下按钮后,将一个新项目添加到 FlatList 并自动滚动到它。我还想在当前 FlatList 中的任何索引处滚动。

我得到的错误是: scrollToIndex out of range: requested index 2 but maximum is 1

为什么它说maximum is 1当我用眼睛看到 FlatList 中至少有 3 个项目时。

已经在这2天了,没有发现任何有用的东西。此外,我还没有找到与使用 scrollToIndex 一起从 FlatLists 添加或删除项目的示例。尝试使用 VirtualizedLists,与 FlatList 相同的问题。我怀疑这是个ref问题。我不明白为什么 FlatList 不更新它呈现的数据的长度,所以我可以滚动到它。

任何建议表示赞赏。

4

1 回答 1

0

更新flatListRef.scrollToIndex({index: I18nManager.isRTL ? array.length - index - 1 : index}); 索引来自 Flatlist renderItem 的位置

于 2021-10-06T12:27:21.060 回答