#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. Это еще одна проблема, не то, о чем вы просили… Другая проблема, другой вопрос или просто отредактируйте их, добавив полную картину проблемы.