lateinit
свойства требуют инициализации их перед первым использованием. Ошибка возникает только в том случае, если она не была инициализирована. Вы можете проверить, инициализирован ли lateinit
, используя свойство isInitialized
интерфейса KProperty0
.
val isReadyForUse = ::viewModel.isInitialized
Внутри Fragment
вы можете инициализировать ViewModel
, используя функция расширения viewModels()
:
import androidx.fragment.app.viewModels
class YourFragment: Fragment {
private val viewModel: YourViewModel by viewModels()
}
Он загружается лениво, что означает, что как только вы попытаетесь получить доступ к viewModel
, он будет инициализирован и возвращен. В следующий раз инициализация не произойдет.
Если вы хотите, чтобы ваш класс ViewModel
сначала загружался в Activity
, а затем в Fragment
, используйте activityViewModels()
.
Примечание: после первой инициализации ViewModel
с помощью activityViewModels()
он будет сохранен в ViewModelStore
, принадлежащем Activity
. Чтобы создать новый экземпляр YourViewModel
с помощью activityViewModels()
, вам нужно будет завершить sh свой Activity
или очистить хранилище модели представления requireActivity().viewModelStore.clear()
.
Для инициализации в Activity и используйте фрагмент, сделайте следующее:
class YourActivity {
override fun onCreate(savedInstanceState: Bundle?) {
val viewModelInit = ViewModelProvider(this).get(YourViewModel.javaClass)
}
}
И в Fragment
:
import androidx.fragment.app.activityViewModels
class YourFragment: Fragment {
private val viewModel: YourViewModel by activityViewModels()
}