Использование Android ViewModel не работает должным образом

При использовании этого кода для получения данных об устройствах он работает хорошо. Но при любом изменении конфигурации (изменении ориентации) загрузка начинается снова вместо доставки уже загруженных данных.

class DevicesViewModel(app: Application) : AndroidViewModel(app) {
    val data = DevicesLiveData()

    inner class DevicesLiveData : LiveData<List<Device>>() {
        init {
            SpecsUtils.devicesListLimit { value = it }
        }
    }
}

Я делаю что-то неправильно? Я следил за учебником по Medium.

Насколько я помню, ViewModel и LiveData предназначены для сохранения изменений конфигурации и событий жизненного цикла, поэтому данные следует загружать только один раз.

Редактировать

Я приобретаю ViewModel вот так

ViewModelProviders.of(this).get<DevicesViewModel>().data.observe(this, Observer {
    adapter.devices = it
})

Можете ли вы поделиться кодом, в котором вы получили DevicesViewModel и использовать его?

ConstOrVar 11.12.2018 09:14

@ConstOrVar добавлен

Ahmad Sattout 11.12.2018 16:18

Это выглядит странно. Не вижу ошибок в вашем коде - выживание модели представления во время изменения конфигурации должно работать.

ConstOrVar 12.12.2018 09:21
0
3
938
1

Ответы 1

Мне нужно было бы посмотреть немного глубже в ваш код, но ваш код, вероятно, не работает, потому что вы передаете this, и вы должны передать this.activity в ViewModelProvider, например:

myviewModel = ViewModelProvider.of(this.activity).get(MyViewModel::class.java)
myviewmodel.data({this.lifecycle}, { data -> Log.d("NEWDATA", data) }

Предполагая, что data является объектом LiveData. Это должно быть сделано для каждого ViewModelProvider, где вы хотите обмениваться данными, например, если вы обмениваетесь данными между двумя разными фрагментами, которые привязаны к одному и тому же действию, тогда вы должны вызвать ViewModelProvider.of(this.activity) для обоих из них.

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