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}")
}
})
我正在构建一个聊天应用程序,我正在检索带有未读消息的最后聊天记录。
我使用 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}")
}
})