Сохраннение данных в ViewModel из одного Activity и перенос этих данных в другой Activity

Суть: Есть два EditText поля в первой Activity, в них пользователь пишет 2 цифры. Чуть ниже этих полей находится кнопка по нажатию которой запускается вторая Activity и появляется toast (всплывающие маленькое сообщение в нижней центральной части экрана) с этими двумя цифрами. Сохранением данных занимается отдельный класс ViewModel. Перепробовал разные методы записи данных, но, предполагаю, что ошибка может быть в другом.

MainActivity.kt

class MainActivity : AppCompatActivity() {
lateinit var sharedViewModel: SharedViewModel
private lateinit var minNumber: EditText
private lateinit var maxNumber: EditText
private lateinit var startGameButton: Button

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    sharedViewModel = ViewModelProvider(this)[SharedViewModel::class.java]

    minNumber = findViewById(R.id.minNumber)
    maxNumber = findViewById(R.id.maxNumber)
    startGameButton = findViewById(R.id.startGameButton)

    startGameButton.setOnClickListener {
        val minInput = minNumber.text.toString()
        val maxInput = maxNumber.text.toString()

        val min = minInput.toIntOrNull()
        val max = maxInput.toIntOrNull()
        sharedViewModel.setMinValue(min)
        sharedViewModel.setMaxValue(max)
        val intent = Intent(this, MainActivity2::class.java)
        startActivity(intent)
    }
}}

SharedViewModel.kt

class SharedViewModel() : ViewModel() {
private val _minValue = MutableStateFlow(0)
val rangeMin: StateFlow<Int> get() = _minValue
private val _maxValue = MutableStateFlow(1)
val rangeMax: StateFlow<Int> get() = _maxValue
fun setMinValue(value: Int) {
    _minValue.value = value
}
fun setMaxValue(value: Int) {
    _maxValue.value = value
}}

MainActivity2.kt

class MainActivity2 : AppCompatActivity() {
lateinit var sharedViewModel: SharedViewModel


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    sharedViewModel = ViewModelProvider(this)[SharedViewModel::class.java]
    var minNumber = sharedViewModel.rangeMin.value.toString()
    var maxNumber = sharedViewModel.rangeMax.value.toString()
    if (sharedViewModel.rangeMin != null && sharedViewModel.rangeMax != null) {
       
        Toast.makeText(applicationContext, minNumber + " " + maxNumber, Toast.LENGTH_SHORT).show()}}

Если запустить приложение и сделать как описано выше, то в toast (всплывающем сообщении) отобразятся цифры, установленные по умолчанию (0 1).


Ответы (1 шт):

Автор решения: ЮрийСПб

ViewModel хранится в специальном хранилище, привязанном, обычно, к активити. Т.е. для разных активити будут разные ViewModel, т.к. хранилище не одно.

То, как вы пробуете - сработало бы, если бы вы использовали фрагменты для разных экранов, а не активити. Фрагменты в одной активити живут и хранилище было бы общее (если указать именно хранилище в активити, а не во фрагменте.)

Если хочется прям разные активити вместо фрагментов с общей активити (что, в вашем простом примере представляется излишним) то можете создать своё хранилище ViewModel-ей в Application классе. Краткий и неполный пример с кодом есть в комменте тут: тык

→ Ссылка