android-рукоятка внедряется в ViewModel

#android #android-viewmodel #dagger-hilt

Вопрос:

я пытаюсь внедрить модуль в MyViewModel

вот мой модуль

 @Module
@InstallIn(ViewModelComponent::class)
object EngineModule {
    @Provides
    fun getEngine(): String = "F35 Engine"
}
 

и это моя модель представления

 @HiltViewModel
class MyViewModel @Inject constructor(): ViewModel() {
    @Inject lateinit var getEngine: String

    fun getEngineNameFromViewModel(): String = getEngineName()
}
 

и это бросает

котлин.Исключение UninitializedPropertyAccessException: свойство lateinit getEngine не было инициализировано

однако, если я изменюсь ViewModelComponent::class ActivityComponent::class и введу вот так

 @AndroidEntryPoint
class MainActivity : ComponentActivity() {

    @Inject
    lateinit var getEngine: String
 

это работает идеально

есть идеи, как внедрить ViewModels?

Ответ №1:

Также вы можете просто удалить @Inject constructor , так как вы уже предоставляете зависимость с помощью модуля dagger:

 @HiltViewModel 
class MyViewModel (private val engineName: String): ViewModel() {

    fun getEngineNameFromViewModel(): String = engineName

}
 

Таким образом, в принципе, вы можете либо предоставить зависимость, используя модуль dagger, либо инъекцию конструктора.

Ответ №2:

Поскольку необходимая зависимость будет введена в ViewModel конструктор, вам просто нужно изменить свой код следующим образом, чтобы он работал:

 @HiltViewModel 
class MyViewModel @Inject constructor(private val engineName: String): ViewModel() {

    fun getEngineNameFromViewModel(): String = engineName

}
 

Комментарии:

1. спасибо за ответ , это бросает java.lang.RuntimeException: Cannot create an instance of class com.example.hilttest.viewModel.MyViewModel , я думаю, потому что я использую ViewModel в моем составном экране, как это @Composable fun ScreenOne(myViewModel: MyViewModel = viewModel()) , без использования фабрики

2. Это еще одна проблема, не то, о чем вы просили… Другая проблема, другой вопрос или просто отредактируйте их, добавив полную картину проблемы.