HashMap 列表在 ViewModel 中为空

HashMap List Is Null In ViewModel

我正在构建一个聊天应用程序,我正在检索带有未读消息的最后聊天记录。

我使用 firebase 作为我的数据库和 MVVM 模式。

所以问题是我必须 运行 3 个 firebase 请求才能获得包含联系人姓名和最后看不见的消息的 HashMap。

我正在 运行ning 存储库中的第一个函数 "getUsersChatList"。 在该函数中,我调用了第二个函数 "getUsersLastChat(arrayList)" 并传递了最后一个函数的结果。

"getUsersLastChat(arrayList)" 我调用了最后一个函数 "searchNumberOfMessages(user)" 并传递了前一个函数的结果。

"searchNumberOfMessages" 结果是一个包含联系人姓名和未读消息的 HashMap 列表。

我在我的存储库顶部声明了一个存储 hashMap 列表的 MutableLiveData,我创建了一个函数来观察它的变化,但是,它没有被调用,因为值没有更新,我不知道为什么.

这是我所做的:

存储库:

顶级存储库:

var newMessages = MutableLiveData<List<HashMap<String, Any?>>>()

getUsersChatList:

fun getUsersChatList(){

        val arrayList = ArrayList<ChatList>()

        chatListRef.child(currentUser!!.uid).addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {

                for (snapshot2 in snapshot.children) {

                    val singleListItem = snapshot2.getValue(ChatList::class.java)

                    if (singleListItem != null) {
                        arrayList.add(singleListItem)
                    }

                }

                getUsersLastChat(arrayList)


            }

            override fun onCancelled(error: DatabaseError) {

            }
        })

    }

getUsersLastChat:

private fun getUsersLastChat(arrayList: ArrayList<ChatList>){

        usersRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {

                for (snapshot2 in snapshot.children){

                    val user = snapshot2.getValue(User::class.java)

                    for (eachChatList in arrayList)
                    {

                        if (user!!.uid.equals(eachChatList.id))
                        {
                            searchNumberOfMessages(user)
                        }

                    }

                }


            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })

    }

这就是问题所在,searchNumberOfMessages:

fun searchNumberOfMessages(user: User) : MutableLiveData<List<HashMap<String, Any?>>> {

        val messageArray = ArrayList<String?>()

        val hashMapArray = ArrayList<HashMap<String, Any?>>()
        val hasMap = HashMap<String, Any?>()

        chatRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {

                for (snapshot2 in snapshot.children) {

                    val chat = snapshot2.getValue(Message::class.java)

                    if (chat!!.receiver.equals(currentUser!!.uid) && chat.sender.equals(
                            user.uid)) {

                        if (chat.seen == false){
                            messageArray.add(chat.message)
                        }

                    }

                }


                hasMap["Sender"] = user.userName
                hasMap["Messages"] = messageArray.size


                hashMapArray.add(hasMap)

                newMessages.value = hashMapArray

                Log.e("newMessages", "newMessages: ${newMessages.value}") // Getting the current Values with No Problem


            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })

        Log.e("newMessages2", "newMessages2: ${newMessages.value}") // Getting null on the same value and pass the null object to the viewModel

        return newMessages
    }

在视图模型中:

fun getUsersChatList(): MutableLiveData<List<HashMap<String, Any?>>> {
    mainRepository.getUsersChatList()
    return mainRepository.newMessages
}

而在activity中:

chatsListFragmentViewModel.getUsersChatList().observe(viewLifecycleOwner,object : Observer<List<HashMap<String, Any?>>?> {
            override fun onChanged(t: List<HashMap<String, Any?>>?) {

                Log.e("userMessagesHashMap","userMessagesHashMap ${t}")

            }
        })

这是logcat中的结果:

2022-01-20 04:13:31.604 13145-13145/com.dapps.misronim E/newMessages2: newMessages2: null
2022-01-20 04:13:31.610 13145-13145/com.dapps.misronim E/newMessages2: newMessages2: null
2022-01-20 04:13:31.779 13145-16093/com.dapps.misronim D/FA: Application going to the background
2022-01-20 04:13:31.859 13145-13145/com.dapps.misronim E/newMessages: newMessages: [{Sender=Mario, Messages=4}]
2022-01-20 04:13:31.873 13145-13145/com.dapps.misronim E/newMessages: newMessages: [{Sender=Dj, Messages=2}]
2022-01-20 04:13:31.886 13145-13145/com.dapps.misronim E/newMessages: newMessages: [{Sender=Jfioo32856, Messages=0}]

非常感谢您的宝贵时间和帮助,非常感谢!

  Log.e("newMessages2", "newMessages2: ${newMessages.value}")

        return newMessages
    }`

此代码将 return 空值,因为 ondataChanged 尚未完成。这意味着你不能 return 任何东西。尝试改为观察 newMessages

//in your viewModel
val messages = mainRepository.newMessages

fun getUsersChatList(){
 mainRepository.getUserChatList()
}
//in your fragment
chatsListFragmentViewModel.getUserChatList()
chatsListFragmentViewModel.messages.observe(viewLifecycleOwner,object : 
Observer<List<HashMap<String, Any?>>?> {
        override fun onChanged(t: List<HashMap<String, Any?>>?) {

            Log.e("userMessagesHashMap","userMessagesHashMap ${t}")

        }
    })