Могу ли я поделиться ViewModel внутри объекта-компаньона?

У меня проблема с 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)

        }

    }
}    

Приложение работает корректно, но я боюсь безопасности. Это правильный путь?

1
0
1 281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is it safe?

Я вполне уверен, что это противоречит тому, что имеют в виду разработчики ViewModel. В частности, имейте в виду, что ViewModel очищается, когда его LifecycleOwner уничтожается, и поэтому вы можете столкнуться с проблемами с очищаемыми общими ViewModel объектами, когда вы бы предпочли, чтобы они этого не делали.

Лично я бы не стал использовать такой подход.

Is exists another recommended way?

Вот три:

  • Имейте одно действие и два фрагмента с общим ViewModel между фрагментами. Совместное использование ViewModel между фрагментами — это просто вопрос использования ViewModelProviders.of(requireActivity()) вместо ViewModelProviders.of(this). Или, если вы используете компонент навигации, вы можете использовать ViewModel область действия для определенного навигационного графика.

  • Передавайте данные между действиями с помощью Intent дополнений.

  • Пусть общие данные управляются репозиторием, передавая идентификаторы между действиями через Intent дополнительные функции для поиска этих данных в репозитории.

Я согласен, ViewModel не должен быть в сопутствующем объекте

Gauri Gadkari 16.07.2019 20:30

Спасибо за ответ. Мои опасения относительно этого метода подтвердились. Еще раз спасибо

Rejfi 16.07.2019 20:32

Другие вопросы по теме