在iOS上,使用inverted的 点击状态栏时会滚动到最底部,而不是滚动到顶部
我在使用 <FlatList inverted />,在iOS上点击状态栏时,我期望列表能滚动到顶部。然而,它却滚动到底部。甚至刷新控件也会呈现在底部,而不是顶部。
https://reactnative.dev/docs/flatlist#inverted
这在聊天应用中很有用,但用户体验并不好:当用户点击状态栏时,列表不会滚动到顶部。并且如果他们的滚动位置离末端有些距离,点击状态栏会把他们带到列表底部。这与Discord或 Whatsapp的行为不同。
解决方案
这是React Native的 FlatList的 inverted属性的一个已知限制。
这个属性实际所做的只是对组件应用一个旋转变换(scaleY: -1),同时也会翻转坐标系。
通常的修复方法是不要使用inverted,而是翻转你的数据,然后手动翻转滚动方向,让iOS能滚动到真正的顶部。
// Reverse your messages before passing to FlatList
const reversedMessages = [...messages].reverse();
<FlatList
ref={flatListRef}
data={reversedMessages}
keyExtractor={(item) => item.id}
// Scroll to end on mount to show latest messages
onLayout={() => flatListRef.current?.scrollToEnd({ animated: false })}
onContentSizeChange={() => flatListRef.current?.scrollToEnd({ animated: false })}
maintainVisibleContentPosition={{
minIndexForVisible: 0,
}}
/>
取舍在于你需要自行处理滚动到新的底部。
但你会得到原生的状态栏滚动到顶部的体验,且下拉刷新会在顶部呈现,符合用户的预期,就像Discord和 Whatsapp一样。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。