This is my DI setup to achieve Lifecycle SavedState logic:
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
}
}
SplashActivityModule:
@Module
abstract class SplashActivityModule : BaseActivityModule<SplashActivity>() {
@Binds
@IntoMap
@ViewModelKey(SplashViewModel::class)
abstract fun bindFactory(factory: SplashViewModel.Factory): ViewModelAssistedFactory<out ViewModel>
@Module
companion object{
@JvmStatic
@Nullable
@Provides
fun provideDefaultArgs(): Bundle? {
return null
}
}
}
ViewModel:
class SplashViewModel @AssistedInject constructor(
@Assisted stateHandle: SavedStateHandle,
...
) : BaseViewModel(stateHandle,...) {
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
}
Now let's assume I want to add another ViewModel
to my Activity
, this will fail:
AnotherViewModel:
class AnotherViewModel @AssistedInject constructor(
@Assisted stateHandle: SavedStateHandle,
...
) : BaseViewModel(stateHandle,...) {
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<AnotherViewModel>
}
SplashActivityModule:
@Module
abstract class SplashActivityModule : BaseActivityModule<SplashActivity>() {
@Binds
@IntoMap
@ViewModelKey(SplashViewModel::class)
abstract fun bindFactory(factory: SplashViewModel.Factory): ViewModelAssistedFactory<out ViewModel>
@Binds
@IntoMap
@ViewModelKey(AnotherViewModel::class)
abstract fun bindAnotherFactory(factory: AnotherViewModel.Factory): ViewModelAssistedFactory<out ViewModel>
@Module
companion object{
@JvmStatic
@Nullable
@Provides
fun provideDefaultArgs(): Bundle? {
return null
}
}
}
error: [Dagger/MissingBinding] ....AnotherViewModel cannot be provided without an @Inject constructor or an @Provides-annotated method. public abstract interface ApplicationComponent extends dagger.android.AndroidInjector<...Application> {
How can I make this work?