У меня проблема с MVVM на Android. Я хочу обмениваться данными между двумя действиями. В одном из них я создал ViewModel (MainActivity), а затем в сопутствующем объекте делюсь ViewModel с другим действием (SecondActivity). Это безопасно? Существует ли другой рекомендуемый способ?
Спасибо за любую помощь и объяснение
class SecondActivity : AppCompatActivity() {
lateinit var viewModelTwo: ViewModelForActivities
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
override fun onStart() {
super.onStart()
viewModelTwo = MainActivity.viewModel
textViewTwo.setText(viewModelTwo.licznik.toString())
}
}
class MainActivity : AppCompatActivity() {
companion object{
lateinit var viewModel: ViewModelForActivities
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(ViewModelForActivities::class.java)
textViewOne.setOnClickListener {
val intent = Intent(applicationContext, SecondActivity::class.java)
viewModel.licznik++
startActivity(intent)
}
}
}
Приложение работает корректно, но я боюсь безопасности. Это правильный путь?
Is it safe?
Я вполне уверен, что это противоречит тому, что имеют в виду разработчики ViewModel. В частности, имейте в виду, что ViewModel очищается, когда его LifecycleOwner уничтожается, и поэтому вы можете столкнуться с проблемами с очищаемыми общими ViewModel объектами, когда вы бы предпочли, чтобы они этого не делали.
Лично я бы не стал использовать такой подход.
Is exists another recommended way?
Вот три:
Имейте одно действие и два фрагмента с общим ViewModel между фрагментами. Совместное использование ViewModel между фрагментами — это просто вопрос использования ViewModelProviders.of(requireActivity()) вместо ViewModelProviders.of(this). Или, если вы используете компонент навигации, вы можете использовать ViewModel область действия для определенного навигационного графика.
Передавайте данные между действиями с помощью Intent дополнений.
Пусть общие данные управляются репозиторием, передавая идентификаторы между действиями через Intent дополнительные функции для поиска этих данных в репозитории.
Спасибо за ответ. Мои опасения относительно этого метода подтвердились. Еще раз спасибо
Я согласен, ViewModel не должен быть в сопутствующем объекте