我正在用Flatlist
制作一个聊天框。我想添加一个新项目到数据中,然后滚动到列表的底部。我使用scrollToEnd
方法,但它不起作用。我该怎么做呢?
<FlatList
ref="flatList"
data={this.state.data}
extraData = {this.state}
renderItem={({item}) => <Text style={styles.chatFlatListItem}>{item.chat}</Text>}
/>
AddChat(_chat){
var arr = this.state.data;
arr.push({key: arr.length, chat: _chat});
var _data = {};
_data["data"] = arr;
this.setState(_data);
this.refs.flatList.scrollToEnd();
}
8条答案
按热度按时间cuxqih211#
我找到了一个更好的解决方案,
scrollToEnd()
不起作用,因为它是在对FlatList
进行更改之前触发的。因为它继承自
ScrollView
,所以这里最好的方法是在onContentSizeChange
中调用scrollToEnd()
,如下所示:nr7wwzry2#
感谢@Kernael,只需添加如下超时:
rfbsl7qr3#
试试这个,管用。
unguejic4#
我的问题是
scrollToEnd()
在移动的上运行良好,但在网络上总是滚动到顶部。可能是因为我在FlatList
中有不同大小的元素,无法定义getItemLayout
。但感谢accepted answer,我解决了这个问题。只是方法不同。这在移动的和网络上都很有效。希望对某些人有帮助。
2jcobegt5#
修改你的代码如下。
ref
被修改,最好在你的FlatList
中使用getItemLayout
。**注意:**请将
ITEM_HEIGHT
替换为列表项高度的真实的值。wwtsj6pe6#
1.尝试对
Fatlist
本身使用反向推进1.像这样传递数据
[...data].reverse()
1.如果您位于列表的中间位置,并且在添加新项目时需要滚动到末尾,只需用途:
cclgggtu7#
似乎是这条线造成的
https://github.com/facebook/react-native/blob/3da3d82320bd035c6bd361a82ea12a70dba4e851/Libraries/Lists/VirtualizedList.js#L1573
当使用触发器scrollToEnd时,帧偏移为0
https://github.com/facebook/react-native/blob/3da3d82320bd035c6bd361a82ea12a70dba4e851/Libraries/Lists/VirtualizedList.js#L390
如果等待1秒,_onContentSize将发生变化,且frame.offset将被赋值(例如,1200像素)。
相关帖子https://github.com/facebook/react-native/issues/30373#issuecomment-1176199466
g6baxovj8#
只需在Flatlist呈现之前添加一个加载器即可。