具有数据类的 LiveData 不会在 ViewModel 中更新

问题描述 投票:0回答:2

我想在我的 MainViewModel 中使用我的数据类 AuthData。

package de.hsfl.appamigos.capturetheflag

import androidx.lifecycle.MutableLiveData

data class AuthData(var game: MutableLiveData<String>)
package de.hsfl.appamigos.capturetheflag

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {
    private val authData: MutableLiveData<AuthData> = MutableLiveData()

    fun getGame(): LiveData<AuthData> = authData

    fun setGame(newAuthData: AuthData) {
        authData.value?.game = newAuthData.game
    }

    fun startNewGame(text: String) {
        val newGame = MutableLiveData("1234")
        val newAuthData = AuthData(newGame)
        setGame(newAuthData)
    }
}

当我尝试观察我的片段之一的变化时,它没有得到通知。

package de.hsfl.appamigos.capturetheflag

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import de.hsfl.appamigos.capturetheflag.databinding.FragmentLobbyBinding

class LobbyFragment : Fragment() {

    ...

    val mainViewModel: MainViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        // Inflate the layout for this fragment
        //val root = inflater.inflate(R.layout.fragment_lobby, container, false)
        val binding = FragmentLobbyBinding.inflate(inflater)
        val naviGraph = findNavController()

        mainViewModel.getGame().observe(viewLifecycleOwner) {
            binding.textViewGameID.text = it.game.toString()
        }

        ...

        return binding.root;
        //return inflater.inflate(R.layout.fragment_lobby, container, false)
    }
}

我尝试取出数据类,只使用可变的,并且工作正常,所以所有连接都有点正确。 我想这是因为 authData 没有改变,但属性 game 改变了。如何观察属性本身的变化? 我无法解决数据类问题,因为这是我的教授的要求。我可以使用普通课程,但我看不出这有什么帮助。

android kotlin mvvm android-livedata android-viewmodel
2个回答
0
投票

我猜这是因为 authData 没有改变,但属性游戏改变了。

正是如此。

如何观察属性本身的变化?

观察属性本身。

mainViewModel.getGame().game.observe(viewLifecycleOwner) {
    binding.textViewGameID.text = it.game.toString()
}

或者更新当前观察到的整个对象。

fun setGame(newAuthData: AuthData) {
    //authData.value?.game = newAuthData.game
    authData.value = newAuthData
}

附注- 你的方法名称很混乱。获取并设置“游戏” 获取并设置一个“AuthData”,它本身有一个“游戏”?如果您要获取并设置“AuthData”,只需将其称为

getAuthData
setAuthData


0
投票

您在 LiveData 的数据类中有一个 LiveData。听起来不太对。

您的数据类应该只包含简单的类,即数字或字符串等,或其他数据类。此外,当从视图模型中公开时,您的数据类应该是不可变的,也就是说,它们只包含

val
属性。你的数据类应该看起来像这样:

data class AuthData(val game: String)

使视图模型适应更改后的数据类,如下所示:

class MainViewModel : ViewModel() {
    private val authData: MutableLiveData<AuthData> = MutableLiveData()

    fun getGame(): LiveData<AuthData> = authData

    private fun setGame(newAuthData: AuthData) {
        authData.value = newAuthData
    }

    fun startNewGame(text: String) {
        val newGame = "1234"
        val newAuthData = AuthData(newGame)
        setGame(newAuthData)
    }
}

现在一切都应该正常了。

© www.soinside.com 2019 - 2024. All rights reserved.