Hello Abir, can you provide a sample?
I’m facing a problem where I have an Activity with 2 ViewModels and I’m getting
cannot be provided without an @Inject constructor or an @Provides-annotated method.
for the second. I was doing something like this:
BaseActivityModule:
@Module
abstract class BaseActivityModule<A : AppCompatActivity> {
@Binds
abstract fun provideActivity(activity : A): AppCompatActivity
@Binds
internal abstract fun bindSavedStateRegistryOwner(activity : A): SavedStateRegistryOwner
@Module
companion object {
@Provides
@ActivityContext
fun provideContext(activity: AppCompatActivity): Context = activity
}
}
SampleActivityModule:
@Module
abstract class SampleActivityModule : BaseActivityModule<SampleActivity>() {
@Binds
@IntoMap
@ViewModelKey(SampleActivityViewModelA::class)
abstract fun bindFactory(factory: SampleActivityViewModelA.Factory): ViewModelAssistedFactory<out ViewModel>
@Binds
@IntoMap
@ViewModelKey(SampleActivityB::class)
abstract fun bindFactory2(factory: SampleActivityBViewModel.Factory): ViewModelAssistedFactory<out ViewModel>
@Module
companion object{
@JvmStatic
@Nullable
@Provides
fun provideDefaultArgs(): Bundle? {
return null
}
}
}
And the ViewModels:
A:
class SampleActivityViewModelA @AssistedInject constructor(
@Assisted stateHandle: SavedStateHandle, ...) : BaseViewModel(stateHandle, ...) {
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SampleActivityViewModelA>
B:
class SampleActivityViewModelB @AssistedInject constructor(
@Assisted stateHandle: SavedStateHandle, ...) : BaseViewModel(stateHandle, ...) {
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SampleActivityViewModelB>
But it fails :/
EDIT: so it turns out I was doing things right, just one piece off the puzzle missing. Check it here.