@AssistedInject в ViewModel с использованием Dagger (НЕ Hilt, просто Dagger) не компилируется: невозможно предоставить б ⇐ Android
@AssistedInject в ViewModel с использованием Dagger (НЕ Hilt, просто Dagger) не компилируется: невозможно предоставить б
Я использую Android Studio — Dagger 2.35.1 (не Hilt, просто Dagger), внедрение ViewModel отлично работает с использованием шаблона @Injectstructor(), все это весело и весело, но я передаю идентификатор через функцию для модель представления, которая мне не нравится, поэтому теперь я пытаюсь реализовать параметр @Assisted в ViewModel, чтобы ViewModel получала этот параметр во время построения, этот параметр входит в намерение действия.
После добавления шаблона конструктора @AssistedInject() во ViewModel кинжал теперь жалуется:
[Dagger/MissingBinding DetailsViewModel не может быть предоставлен без конструктора @Inject или метода с аннотацией @Provides
Я просмотрел все вопросы и примеры, но никто не объяснил полного решения или почему Dagger отправляет эту ошибку, они просто публикуют фрагменты кода, похоже, что Dagger даже не знает, как обрабатывать @AssistedInjection, на данный момент я у меня закончились идеи.
конструктор класса DetailsViewModel @AssistedInject( приложение: Приложение, репозиторий val: DetailsRepository, @Assisted val id: Строка, ) : BaseViewModel(приложение) { @AssistedFactory Interface Factory { fun create(@Assisted id: String) : DetailsViewModel } сопутствующий объект { @Suppress("UNCHECKED_CAST") веселая фабрика( фабрика: Фабрика, идентификатор: строка ) : ViewModelProvider.Factory { возвращаемый объект: ViewModelProvider.Factory { переопределить fun create(modelClass: Class): T = Factory.create(id) как T } } } класс DetailsActivity : AppCompatActivity() { @Инжект lateinit var viewModelFactory: DetailsViewModel.Factory частный lateinit var viewModel: DetailsViewModel переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (приложение как MyApplication).appComponent.inject(this) val id = Intent.getStringExtra("ID").orEmpty() viewModel = ViewModelProvider(this, DetailsViewModel.factory( viewModelFactory, идентификатор ))[DetailsViewModel::class.java] } ViewModelModule.java
@Module публичный абстрактный класс ViewModelModule { @Binds @IntoMap @ViewModelKey(DetailsViewModel.class) абстрактная ViewModel связываниеDetailsViewModel (DetailsViewModel viewModel); } AppComponent.java
@Синглтон @Component(modules = {AppModule.class, .class, ViewModelModule.class}) общедоступный интерфейс AppComponent { void inject (активность DetailsActivity); }
Я использую Android Studio — Dagger 2.35.1 (не Hilt, просто Dagger), внедрение ViewModel отлично работает с использованием шаблона @Injectstructor(), все это весело и весело, но я передаю идентификатор через функцию для модель представления, которая мне не нравится, поэтому теперь я пытаюсь реализовать параметр @Assisted в ViewModel, чтобы ViewModel получала этот параметр во время построения, этот параметр входит в намерение действия.
После добавления шаблона конструктора @AssistedInject() во ViewModel кинжал теперь жалуется:
[Dagger/MissingBinding DetailsViewModel не может быть предоставлен без конструктора @Inject или метода с аннотацией @Provides
Я просмотрел все вопросы и примеры, но никто не объяснил полного решения или почему Dagger отправляет эту ошибку, они просто публикуют фрагменты кода, похоже, что Dagger даже не знает, как обрабатывать @AssistedInjection, на данный момент я у меня закончились идеи.
конструктор класса DetailsViewModel @AssistedInject( приложение: Приложение, репозиторий val: DetailsRepository, @Assisted val id: Строка, ) : BaseViewModel(приложение) { @AssistedFactory Interface Factory { fun create(@Assisted id: String) : DetailsViewModel } сопутствующий объект { @Suppress("UNCHECKED_CAST") веселая фабрика( фабрика: Фабрика, идентификатор: строка ) : ViewModelProvider.Factory { возвращаемый объект: ViewModelProvider.Factory { переопределить fun create(modelClass: Class): T = Factory.create(id) как T } } } класс DetailsActivity : AppCompatActivity() { @Инжект lateinit var viewModelFactory: DetailsViewModel.Factory частный lateinit var viewModel: DetailsViewModel переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (приложение как MyApplication).appComponent.inject(this) val id = Intent.getStringExtra("ID").orEmpty() viewModel = ViewModelProvider(this, DetailsViewModel.factory( viewModelFactory, идентификатор ))[DetailsViewModel::class.java] } ViewModelModule.java
@Module публичный абстрактный класс ViewModelModule { @Binds @IntoMap @ViewModelKey(DetailsViewModel.class) абстрактная ViewModel связываниеDetailsViewModel (DetailsViewModel viewModel); } AppComponent.java
@Синглтон @Component(modules = {AppModule.class, .class, ViewModelModule.class}) общедоступный интерфейс AppComponent { void inject (активность DetailsActivity); }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение