这是我的DI设置,用于实现Lifecycle SavedState逻辑:
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
}
}
SomeActivityModule:
@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>
}
现在假设我想向我的ViewModel
添加另一个Activity
,这将失败:
@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
}
}
}
错误:[Dagger / MissingBinding].... AnotherViewModel不能是提供时没有@Inject构造函数或@Provides注释方法。公共抽象接口ApplicationComponent扩展dagger.android.AndroidInjector <... application> {
我该如何进行这项工作?
只剩下一个谜题,只需在SampleActivity中添加我的ViewModel
实例:
class SampleActivity : BaseActivity<ActivitySplashBinding, SplashViewModel>() {
private val anotherViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(AnotherViewModel::class.java) }
...
binding.anotherViewModel = anotherViewModel
}
现在可以使用!