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
的值何时更改为call
scrollToEnd
并加载其余值。我的代码的简化版本,用于解释其工作原理:

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