React Native FlatList初始滚动到底部

39

我正在尝试使用 <Flatlist /> 在 React Native 中创建一个聊天室。

就像 WhatsApp 和其他聊天应用一样,消息从底部开始显示。

从我的 API 获取消息后,我调用

this.myFlatList.scrollToEnd({animated: false});

但它有时会在中间滚动,有时底部的项目较少,有时什么也不做。

我如何最初将其滚动到底部?

我的聊天消息高度不同,因此无法计算高度。

16个回答

0

如果你想让FlatList在初始渲染时滚动到底部,只需将inverted={-1}添加到你的FlatList中。我曾经为了让FlatList滚动到底部而苦苦挣扎了几个小时,但最终发现只需要使用inverted={-1}即可。不需要考虑使用getItemLayout和initialScrollIndex等方法来动态地测量FlatList项的高度。


这样做是行不通的,因为你只会把一切都倒置。 - Cyrus Zei
这在iOS上似乎可以工作,但在Android上它会颠倒项目的顺序... - Ray

0

  1. 列表项


标题


/>

这种方法对我很有效,目前仍在使用。感谢@arjantin。##标题##


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

0
我遇到了同样的问题。我制作了一个类似WhatsApp的聊天框,并希望当添加新项目时,我的列表能够滚动到列表的末尾。 我通过使用setTimeout来解决了这个问题。
const ChatBoxList: FC = () => {

  const listRef = useRef<FlatList<MessageType>>(null);
  const [messages, setMessages] = useState<Array<MessageType>>([]);

  const onAddNewItem = (newItem: MessageType) => {
    setMessages(newItem);
    //...
    setTimeout(() => {
      listRef.current?.scrollToEnd({ animated: true });
    }, 100);
  };

  return (
    <FlatList
      ref={listRef}
      //...
    />
  );
}

-1
如果您想显示反转的消息,请在平面列表中将“inverted”设置为true。
<Flatlist
data={messageData}
inverted={true}
horizontal={false}
/>

如果你只想滚动到最后一条消息,可以使用initialScrollIndex

<Flatlist
data={messageData}
initialScrollIndex={messageArray.length - 1}
horizontal={false}
/>

这个解决方案总是会抛出错误:不变式违规:scrollToIndex 应该与 getItemLayout 或 onScrollToIndexFailed 一起使用,否则无法知道屏幕外索引的位置或处理失败。 - ppulwey
这对我有效。我不知道为什么有人降低了分数。inverted 特性在聊天消息中无法使用。 - Baris Senyerli
问题是如何导航到最后一个项目,它可以是图像列表、产品列表或其他东西。因此,反转只会颠倒您的数组并将最后一个项目显示在顶部。 我们需要scrollToEnd功能。谢谢。 - Engr.Aftab Ufaq

-1

我花了几个小时努力地尝试在不计算包含链接和消息的项目高度的情况下将第一条消息显示在顶部。但最终我成功了...

我的做法是将FlatList包装在一个View中,将FlatList设置为倒置,使其占用所有可用空间,然后调整内容。现在,只有几条消息的对话从顶部开始,但当有多条消息时,它们将结束在底部。就像这样:

<View style={ConversationStyle.container}>
    <FlatList
        data={conversations}
        initialNumToRender={10}
        renderItem={({ item }) => (
            <SmsConversationItem
                item={item}
                onDelete={onDelete}
            />
        )}
        keyExtractor={(item) => item.id}
        getItemCount={getItemCount}
        getItem={getItem}
        contentContainerStyle={ConversationStyle.virtualizedListContainer}
        inverted // This will make items in reversed order but will make all of them start from bottom
    />
</View>

我的样式看起来像这样:

const ConversationStyle = StyleSheet.create({
    container: {
        flex: 1
    },

    virtualizedListContainer: {
        flexGrow: 1,
        justifyContent: 'flex-end'
    }
};


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接