Kotlin Android 项目在 ViewModel 中使用数据类

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

我想在我的 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 没有改变,但属性游戏改变了。如何观察属性本身的变化? 我无法解决数据类问题,因为这是我的教授要求的,我可以使用普通类,但我看不出这有什么帮助。

android kotlin mvvm viewmodel
1个回答
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

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