Как прослушивать изменения firestore в реальном времени?

Я реализую чат приложение , для этого мне нужно обрабатывать сообщения сразу при отправке , но я сталкиваюсь со следующей проблемой

Вот код слушателя сообщений

    private fun listenMessage() {
    database
        .collection(KEY_COLLECTION_USERS)
        .document(preferenceManager.getString(KEY_USER_ID)!!)
        .collection(KEY_COLLECTION_CHAT)
        .addSnapshotListener { value, error ->
            if (error != null) {
                return@addSnapshotListener
            } else {
                if (value == null) {
                    return@addSnapshotListener
                } else {

                    for (documentChange in value.documentChanges) {
                        if (documentChange.type == DocumentChange.Type.ADDED) {
                            var doc = documentChange.document
                            if (doc.getString(KEY_MESSAGE_RECEIVER_ID) == receiverUser.uid) {
                                var text = doc.getString(KEY_MESSAGE).toString()
                                var id = doc.getString(KEY_MESSAGE_ID).toString()
                                var receiverId =
                                    doc.getString(KEY_MESSAGE_RECEIVER_ID).toString()
                                var date = doc.getTimestamp(KEY_MESSAGE_DATE)!!.toDate()
                                var isChecked = doc.getBoolean(KEY_MESSAGE_ISCHECKED)!!
                                var type = doc.getString(KEY_TYPE_MESSAGE).toString()
                                var message =
                                    Message(text, id, receiverId, date, isChecked, type)
                                if (message !in messages) {
                                    messages.add(message)
                                }
                            }
                        }
                    }
                    messages.sortBy { it -> it.date }
                    var messages_test = ArrayList(messages)
                    userChatAdpater.updateList(messages_test)
                    if (messages.size != 0) {
                        mBinding.rvUserChat.smoothScrollToPosition(messages.size - 1)
                    }
                }
            }
        }
    database
        .collection(KEY_COLLECTION_USERS)
        .document(receiverUser.uid)
        .collection(KEY_COLLECTION_CHAT)
        .addSnapshotListener { value, error ->
            if (error != null) {
                return@addSnapshotListener
            } else {
                if (value == null) {
                    return@addSnapshotListener
                } else {
                    for (documentChange in value.documentChanges) {
                        documentChange.document.reference.update(KEY_MESSAGE_ISCHECKED, true)
                        if (documentChange.type == DocumentChange.Type.ADDED) {
                            var doc = documentChange.document
                            if (doc.getString(KEY_MESSAGE_RECEIVER_ID) == preferenceManager.getString(
                                    KEY_USER_ID
                                )
                            ) {
                                var text = doc.getString(KEY_MESSAGE).toString()
                                var id = doc.getString(KEY_MESSAGE_ID).toString()
                                var receiverId =
                                    doc.getString(KEY_MESSAGE_RECEIVER_ID).toString()
                                var date = doc.getDate(KEY_MESSAGE_DATE)!!
                                var isChecked = doc.getBoolean(KEY_MESSAGE_ISCHECKED)!!
                                var type = doc.getString(KEY_TYPE_MESSAGE).toString()
                                var message =
                                    Message(text, id, receiverId, date, isChecked, type)
                                if (message !in messages) {
                                    messages.add(message)
                                }
                            }
                        }
                    }
                    messages.sortBy { it -> it.date }
                    var messages_test = ArrayList(messages)
                    userChatAdpater.updateList(messages_test)
                    if (messages.size != 0) {
                        mBinding.rvUserChat.smoothScrollToPosition(messages.size - 1)
                    }
                }
            }
        }
}

При попадании на экран чата , все сообщения подгружаются нормально

date -> {Value@24360} "# com.google.firestore.v1.Value@f6d54b4d
timestamp_value {
nanos: 926000000
seconds: 1661083055
}

Но при отправке сообщения происходит следующее

date -> {Value@24661} "# com.google.firestore.v1.Value@5340a934
map_value {
 fields {
   key: "__type__"
   value {
     string_value: "server_timestamp"
   }
 }
 fields {
   key: "__local_write_time__"
   value {
     timestamp_value {
       nanos: 576000000
       seconds: 1661089684
     }
   }
 }
 }"

Из-за этого в date записывается null Но я не знаю другого способа реализации прослушивателя сообщений Время генерируется благодаря @ServerTimestamp


Ответы (0 шт):