我的 App.js 中有以下代码:
- 主要的
ref
FlatList 设置在一个useEffect
钩子中flatListRef
const [flatListRef, setFlatListRef] = useState(null);
...
useEffect(() => {
let mounted = true;
if (refSlides?.current && mounted) setFlatListRef(refSlides.current);
return () => mounted = false;
}, []);
- 将
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>
);
};
- 实际的 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 不更新它呈现的数据的长度,所以我可以滚动到它。
任何建议表示赞赏。