React native 完成平面列表渲染后调用scrolToEnd
我有一个聊天应用程序,它使用扁平列表来发送消息。此平面列表需要在两个方向上无限加载(以查看较旧的消息或较新的消息) 由于React native 完成平面列表渲染后调用scrolToEnd,react-native,react-native-flatlist,flatlist,React Native,React Native Flatlist,Flatlist,我有一个聊天应用程序,它使用扁平列表来发送消息。此平面列表需要在两个方向上无限加载(以查看较旧的消息或较新的消息) 由于maintainVisibleContentPosition道具在Android上不起作用,我不得不想出一个办法来加载内容而不丢失屏幕上的内容 如果用户到达聊天室的顶部,请将平面列表设置为反向->滚动结束(屏幕顶部)->加载旧消息 如果用户到达聊天的底部,请将平面列表设置为正常->滚动结束(屏幕底部)->加载最近的消息 我使用useffect来检测inversed的值何时更
maintainVisibleContentPosition
道具在Android上不起作用,我不得不想出一个办法来加载内容而不丢失屏幕上的内容
- 如果用户到达聊天室的顶部,请将平面列表设置为反向->滚动结束(屏幕顶部)->加载旧消息
- 如果用户到达聊天的底部,请将平面列表设置为正常->滚动结束(屏幕底部)->加载最近的消息
useffect
来检测inversed
的值何时更改为callscrollToEnd
并加载其余值。我的代码的简化版本,用于解释其工作原理:
const [useInverted, setuseInverted] = React.useState(false);
const [reversing, setreversing] = React.useState(false);
const loadTop = React.useCallback(() => {
if (!useInverted) {
setuseInverted(true);
setreversing(true);
} else {
// Load old messages
}
}, [useInverted]);
const loadBottom = React.useCallback(() => {
if (useInverted) {
setuseInverted(false);
setreversing(true);
} else {
// Load recent messages
}
}, []);
React.useEffect(() => {
// Should be called after FlatList rerendered completely
if(reversing){
flatlist.current.scrollToEnd({ animated: false }); // <--- THIS doesn't work. List stays at start
if (useInverted) {
loadTop();
}else{
loadBottom();
}
}
}, [useInverted, loadBottom, loadTop ]);
return (
<FlatList
key={string(useInverted)} // Changing the key of the flatlist otherwise it doesn't update
inverted={useInverted}
// ...other props + logic to call loadTop and loadBottom
/>
)
const[useInverted,setuseInverted]=React.useState(false);
const[reversing,setreversing]=React.useState(false);
const loadTop=React.useCallback(()=>{
如果(!UseInversed){
SetUseInversed(真);
设置反转(真);
}否则{
//加载旧邮件
}
},[USE]);
const loadBottom=React.useCallback(()=>{
如果(使用倒排){
SetUseInversed(假);
设置反转(真);
}否则{
//加载最近的消息
}
}, []);
React.useffect(()=>{
//应在完全重新提交平面列表后调用
如果(倒车){
flatlist.current.scrollToEnd({animated:false});//
)
我的问题是useEffect调用得太早,而且scrollToEnd
没有任何作用。只有在任意延迟后使用setTimeout()调用scrollToEnd
时,它才起作用
是否有任何方法可以检测平面列表何时完成重新渲染,并且可以安全地调用scrollToEnd