@AssistedInject в ViewModel с использованием Dagger (НЕ Hilt, просто Dagger) не компилируется: невозможно предоставить бAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 @AssistedInject в ViewModel с использованием Dagger (НЕ Hilt, просто Dagger) не компилируется: невозможно предоставить б

Сообщение Anonymous »


I am using Android Studio - Dagger 2.35.1 (Not Hilt, just dagger), the ViewModel injection works fine using @Inject constructor() pattern, all is fun and games, but i am passing the id through a function to viewmodel which is something i do not like, so, now I am trying to implement an @Assisted param in ViewModel so the ViewModel receives the param during the construction, this param comes in the activity's intent.

After adding @AssistedInject constructor() pattern to ViewModel, now dagger complains:

[Dagger/MissingBinding DetailsViewModel cannot be provided without an @Inject constructor or an @Provides-annotated method

I have searched in all the questions and examples but nobody explains the full solution or why dagger sends that error, they just post sections of code, seems that dagger doesn't even know how to handle @AssistedInjection, at this point i am out of ideas.

class DetailsViewModel @AssistedInject constructor( application: Application, val repository: DetailsRepository, @Assisted val id: String, ) : BaseViewModel(application) { @AssistedFactory interface Factory { fun create(@Assisted id: String) : DetailsViewModel } companion object { @Suppress("UNCHECKED_CAST") fun factory( factory: Factory, id: String ) : ViewModelProvider.Factory { return object : ViewModelProvider.Factory { override fun create(modelClass: Class): T = factory.create(id) as T } } } class DetailsActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: DetailsViewModel.Factory private lateinit var viewModel: DetailsViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (application as MyApplication).appComponent.inject(this) val id = intent.getStringExtra("ID").orEmpty() viewModel = ViewModelProvider(this, DetailsViewModel.factory( viewModelFactory, id ))[DetailsViewModel::class.java] } ViewModelModule.java

@Module public abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(DetailsViewModel.class) abstract ViewModel bindDetailsViewModel(DetailsViewModel viewModel); } AppComponent.java
@Singleton @Component(modules = {AppModule.class, .class, ViewModelModule.class}) public interface AppComponent { void inject(DetailsActivity activity); }

Источник: https://stackoverflow.com/questions/780 ... -not-compi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»