React Native: как отобразить новое сообщение внизу?

Я только что закончил внедрять socket.io в свое родное приложение для реагирования, чтобы добиться личного обмена сообщениями 1-1.

Розетка работает правильно, как и требуется, т.е. сообщения отправляются в прямом эфире. Но моя проблема в том, что когда я пытаюсь отправить сообщение, оно добавляется вверху моего перевернутого списка Flatlist, тогда как самые новые сообщения должны отображаться внизу.

Вот мой код:

const message = route.params.message;
const [messages, setMessages] = useState([]);
const [refreshing, setRefreshing] = useState(false);
const [text, setText] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState(false);
const [socket, setSocket] = useState(null);
const { user } = useAuth();

useEffect(() => {
const newsocket =io.connect("http://192.168.1.103:9000")
setMessages(message.Messages)

newsocket.on('connect', msg => {
console.info(`user: ${user.id} has joined conversation ${message.id}`)
setSocket(newsocket)
newsocket.emit('subscribe', message.id);
});

newsocket.on("send_message", (msg) => {
console.info("this is the chat messages:", msg);
setMessages(messages => messages.concat(msg)) // I THINK PROBLEM IS HERE 
});

return(()=>newsocket.close());

}, []);

const onSend = (ConversationId,senderId,receiverId,message) => {
console.info("sent")
const to = (user.id===route.params.message.user1? 
route.params.message.user2:route.params.message.user1)
socket.emit('message', { to: to, from: user.id, message,ConversationId });
setText("")
messagesApi.sendMessage({ConversationId,senderId,receiverId,message});
};

const updateText=(text)=>{
setText(text);
}

return(
<Animated.FlatList
    inverted
    data = {messages}
    keyExtractor = {(item,index)=>index.toString()}
    extraData = {messages} // add this    
    renderItem = {({item,index})=>(
        <>
        <MessageDate_Time 
        text = {moment(item.createdAt).fromNow()} 
        mine = {item.senderId !== user.id}
        />
        <MessageBubble
        text = {item.message}
        mine = {item.senderId !== user.id}
        />
         </>
    )}
    />
)

вы можете использовать деструктурирование массива, чтобы добавить его в конец или перед массивом. Используйте [...messages, newMessage] или [newMessage, ...messages]

Rishabh Anand 22.12.2020 10:51

@RishabhAnand Я попробовал оба предложенных вами решения, к сожалению, они не сработали. что происходит, когда я отправляю сообщение, весь список сообщений исчезает, и отображается только отправленное сообщение.

kd12345 22.12.2020 10:56
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
1
2
719
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замените concat на unshift.

newsocket.on("send_message", (msg) => {
    setMessages(messages => messages.unshift(msg));
    // OR
    const newMessages = [msg, ...messages];
    setMessages(newMessages);
});

Следовательно, вы используете перевернутые реквизиты, сообщения меняются местами, поэтому вам нужно добавить новое сообщение в начале, чтобы оно было в конце. Как-то запутанно :))

Привет, Лери, надеюсь, ты в порядке. Спасибо за ваш ответ, но когда я попробовал это, я продолжаю получать нарушение инварианта: TaskQueue: ошибка с задачей: попытка получить кадр для вне диапазона индекса NaN

kd12345 22.12.2020 11:19

Спасибо большое, вы меня снова спасли. Ценю это :) Кстати, я только что попробовал ваше недавно отредактированное решение, оно не сработало, но предыдущее сработало. это сработало setMessages(messages => [msg,...messages]);

kd12345 22.12.2020 11:44

Другие вопросы по теме