Home > OS >  Arraylist remains null even when data is being passed to it
Arraylist remains null even when data is being passed to it

Time:01-11

I'm working on a firebase chatting app. I want to maintain chats between two different users for this I'm creating a parent node as 923478302658@Chat and within it, a child node as 923478302658- 923065015216 within it messages for both participants.

Here is my Chat Model:

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
}

And here is the function to send a message:

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("")
}

I want to get the firebase nodes structure like this but the app crashes. Why I'm not getting the data like that in the attached pic. [1]: https://i.stack.imgur.com/QOW8c.png

CodePudding user response:

I guess there is an error in how you define val chatMessagesList variable in sendMessage() function. Try to fix it to:

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

Using an Elvis operator ?: we guarantee that chatMessagesList variable won't be null.

When you write this code:

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

chatModel?.chatMessages property isn't created yet, so it is null.

Just replace it with the next line and it will work:

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

Or you can just write:

val chatMessagesList = ArrayList<MessageModel>()

because you create a new object of AllChatsModel class in sendMessage() function, that's why chatModel?.chatMessages will always be null until it is initialized.

  •  Tags:  
  • Related