Отправка переменных между фрагментами и использование их во ViewModel - PullRequest
0 голосов
/ 21 апреля 2020

Я отправляю переменную и получаю ее фрагментом, но это необходимо для пользовательского интерфейса во ViewModel. Каков наилучший способ доступа к переменной в ViewModel?

Отправка фрагмента

val gameMode = 1
val action = PlayFragmentDirections.actionPlayFragmentToGameFragment(gameMode)
findNavController().navigate(action)

Получение фрагмента

    binding = DataBindingUtil.inflate(inflater, R.layout.game_fragment,
        container,false)

    viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)

    val gameFragmentArgs by navArgs<GameFragmentArgs>()
    var x = gameFragmentArgs.gamemode

    binding.gameViewModel = ViewModel
    binding.lifecycleOwner = this

1 Ответ

0 голосов
/ 24 апреля 2020

Использовать ViewModelFactory

GameFragment:

    val gameFragmentArgs by navArgs<GameFragmentArgs>()
    val x = gameFragmentArgs.gamemode

    viewModelFactory = GameViewModelFactory(x)
    viewModel = ViewModelProviders.of(this, viewModelFactory).get(GameViewModel::class.java)

GameViewModelFactory:

class GameViewModelFactory(private val gameMode: Int) : ViewModelProvider.Factory{
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    if (modelClass.isAssignableFrom(GameViewModel::class.java)){
        return GameViewModel(gameMode) as T
    }
    throw IllegalArgumentException("Unknown ViewModel class")
}

}

...