Я только что закончил внедрять 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}
/>
</>
)}
/>
)
@RishabhAnand Я попробовал оба предложенных вами решения, к сожалению, они не сработали. что происходит, когда я отправляю сообщение, весь список сообщений исчезает, и отображается только отправленное сообщение.
Замените concat
на unshift
.
newsocket.on("send_message", (msg) => {
setMessages(messages => messages.unshift(msg));
// OR
const newMessages = [msg, ...messages];
setMessages(newMessages);
});
Следовательно, вы используете перевернутые реквизиты, сообщения меняются местами, поэтому вам нужно добавить новое сообщение в начале, чтобы оно было в конце. Как-то запутанно :))
Привет, Лери, надеюсь, ты в порядке. Спасибо за ваш ответ, но когда я попробовал это, я продолжаю получать нарушение инварианта: TaskQueue: ошибка с задачей: попытка получить кадр для вне диапазона индекса NaN
Спасибо большое, вы меня снова спасли. Ценю это :) Кстати, я только что попробовал ваше недавно отредактированное решение, оно не сработало, но предыдущее сработало. это сработало setMessages(messages => [msg,...messages]);
вы можете использовать деструктурирование массива, чтобы добавить его в конец или перед массивом. Используйте
[...messages, newMessage]
или[newMessage, ...messages]