如何将N个ViewModelAssistedFactory绑定到Activity

问题描述 投票:0回答:1

这是我的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> {

我该如何进行这项工作?

dependency-injection dagger-2 android-lifecycle android-viewmodel viewmodel-savedstate
1个回答
0
投票

只剩下一个谜题,只需在SampleActivity中添加我的ViewModel实例:

class SampleActivity : BaseActivity<ActivitySplashBinding, SplashViewModel>() {

    private val anotherViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(AnotherViewModel::class.java) }
    ...
    binding.anotherViewModel = anotherViewModel    
}

现在可以使用!

© www.soinside.com 2019 - 2024. All rights reserved.