我想在我的 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 改变了。如何观察属性本身的变化? 我无法解决数据类问题,因为这是我的教授的要求。我可以使用普通课程,但我看不出这有什么帮助。
我猜这是因为 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
。
您在 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)
}
}
现在一切都应该正常了。