Я работаю над приложением для чата firebase. Я хочу поддерживать чаты между двумя разными пользователями. Для этого я создаю родительский узел как +923478302658@Chat, а внутри него дочерний узел как +923478302658-+923065015216. внутри него сообщения для обоих участников.

Вот моя модель чата:

class AllChatsModel {
    var chatID: String? = null
    var chatStarterName: String? = null
    var chatRecieverName: String? = null
    var chatStartTD: String? = null
    var chatLastMessage: String? = null
    var chatLastMsgTime: String? = null
    var chatHeadActive: Boolean? = null
    var chatMessages: ArrayList<MessageModel>? = null
}

А вот и функция отправки сообщения:

private fun sendMessage(message: String) {
    val dateFormat = SimpleDateFormat("dd MMMM, yyyy 'at' HH:mm aaa")
    val calendar = Calendar.getInstance()
    val currentTime: String = dateFormat.format(calendar.time)

    val chatID = databaseReference!!.push().key
    val chatModel = AllChatsModel()
    chatModel.chatStarterName = (sharedPreference?.userName)
    chatModel.chatRecieverName = signUpEntity?.userUID
    chatModel.chatStartTD = currentTime
    chatModel.chatLastMessage = message
    chatModel.chatLastMsgTime = currentTime

    val chatMessagesList: ArrayList<MessageModel>? = chatModel?.chatMessages // debugs gives null here
    val messageID = databaseReference!!.push().key
    val messageModel = MessageModel()
    messageModel.messageID = messageID
    messageModel.messageText = message
    messageModel.messageTime = currentTime
    messageModel.msgSenderID = FirebaseAuth.getInstance().uid
    messageModel.msgSenderName = (sharedPreference?.userName)
    messageModel.msgSenderNo = (currentUserNo)
    messageModel.msgReceiverID = signUpEntity?.userUID
    messageModel.msgReceiverName = signUpEntity?.userName
    messageModel.msgReceiverNo = signUpEntity?.userPhone

    chatMessagesList?.add(messageModel) // here chatMessagesList is null
    chatModel.chatMessages = chatMessagesList

    FirebaseDatabase.getInstance().reference.child("${currentUserNo}@Chat")
        .child("${currentUserNo}-${signUpEntity?.userPhone}")
        .child("ChatMessages").setValue(chatModel)

    txtInputMsg.setText("")
}

Я хочу получить такую ​​структуру узлов firebase, но приложение вылетает. Почему я не получаю такие данные на прикрепленном рисунке. [1]: https://i.stack.imgur.com/QOW8c.png

0
Usama Hafeez 10 Янв 2022 в 16:27
Используйте тег android-studio только для вопросов, касающихся самой Android Studio IDE. По общим вопросам о программировании Android используйте тег android.
 – 
Frank van Puffelen
10 Янв 2022 в 18:35

1 ответ

Лучший ответ

Я предполагаю, что есть ошибка в том, как вы определяете переменную val chatMessagesList в функции sendMessage(). Попробуйте исправить это:

val chatMessagesList: ArrayList<MessageModel> = chatModel?.chatMessages ?: ArrayList<MessageModel>()

Используя оператор Элвиса ?:, мы гарантируем, что переменная chatMessagesList не будет нулевой.

Когда вы пишете этот код:

val chatMessagesList: ArrayList<MessageModel>? = chatModel?.chatMessages // debugs gives null here

Свойство chatModel?.chatMessages еще не создано, поэтому оно равно null.

Просто замените его следующей строкой, и она будет работать:

val chatMessagesList: ArrayList<MessageModel> = chatModel?.chatMessages ?: ArrayList<MessageModel>()

Или вы можете просто написать:

val chatMessagesList = ArrayList<MessageModel>()

Поскольку вы создаете новый объект класса AllChatsModel в функции sendMessage(), поэтому chatModel?.chatMessages всегда будет нулевым, пока он не будет инициализирован.

0
Sergey 10 Янв 2022 в 16:43
Хорошо, сэр, это работает. но эта проблема заключается в том, что когда отправляется второе сообщение, оно заменяет первое, как я могу этого избежать
 – 
Usama Hafeez
10 Янв 2022 в 18:01
Пожалуйста, задайте другой вопрос здесь, в Stackoverflow, чтобы лучше понять вашу проблему.
 – 
Sergey
10 Янв 2022 в 18:04