Как использовать новый модуль сохраненного состояния ViewModel - PullRequest
3 голосов
/ 11 января 2020

Я использую жизненный цикл версии 2.2.0-rc03 и официальные документы , а в найденных статьях даже нет правильного имени класса или аргументов конструктора. Я думаю, что мне нужно получить экземпляр ViewModel через что-то вроде

viewModel = ViewModelProvider(this, SavedStateViewModelFactory(requireActivity().application, savedStateRegistryOwner))
            .get(SelectedTracksViewModel::class.java)

, но я не могу понять SavedStateRegistryOwner.

Может кто-нибудь привести простой пример того, как создать сохраненный состояние экземпляра ViewModel и правильный способ сохранить и восстановить значение в ViewModel?

Ответы [ 2 ]

7 голосов
/ 15 января 2020

Для использования модуля «Сохраненное состояние» для View Model необходимо добавить зависимость androidx.lifecycle:lifecycle-viewmodel-savedstate в ваш проект. Этот пример был написан на основе версии 1.0.0-rc03.

Пожалуйста, добавьте следующую строку в файл Gradle вашего проекта:
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc03'

Реализация ViewModel:

class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() {

    val liveDate = state.getLiveData("liveData", Random.nextInt().toString())

    fun saveState() {
        state.set("liveData", liveDate.value)
    }
}

Выполнение упражнения:

class SavedStateActivity : AppCompatActivity() {

    lateinit var viewModel: SavedStateViewModel;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityStateBinding = DataBindingUtil.setContentView(this, R.layout.activity_state)

        viewModel = ViewModelProvider(this, SavedStateViewModelFactory(this.application, this)).get(SavedStateViewModel::class.java)

        binding.viewModel = viewModel
        binding.lifecycleOwner = this
    }

    override fun onSaveInstanceState(outState: Bundle) {
        if(::viewModel.isInitialized)
            viewModel.saveState()

        super.onSaveInstanceState(outState)
    }
}

Я проверил этот код, и он отлично работает.

0 голосов
/ 12 января 2020

Насколько я понимаю, вы хотите создать модель View с конструктором spe c. Вы можете использовать ViewModelProvider.Factory.

viewModel = ViewModelProvider(this, SavedStateViewModelFactory.create(state)
            .get(SelectedTracksViewModel::class.java)

пример ViewModelFactory

public class SavedStateViewModelFactory {

    public static <E> ViewModelProvider.Factory create(State state){

        return new ViewModelProvider.Factory() {
            @NonNull
            @Override
            @SuppressWarnings("unchecked")
            public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
                if (modelClass.isAssignableFrom(SelectedTracksViewModel.class)) {
                    return (T) new SelectedTracksViewModel<>(state);
                } else {
                    throw new IllegalArgumentException("Unknown ViewModel class");
                }
            }
        };
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...