1

这是我实现Lifecycle SavedState逻辑的 DI 设置:

基本活动模块:

@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
    }
}

飞溅活动模块:

@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
        }
    }
}

视图模型:

class SplashViewModel @AssistedInject constructor(
    @Assisted stateHandle: SavedStateHandle,
    ...
) : BaseViewModel(stateHandle,...) {

    @AssistedInject.Factory
    interface Factory : ViewModelAssistedFactory<SplashViewModel>
}

现在假设我想在ViewModelmy中添加另一个Activity,这将失败:

另一个视图模型:

class AnotherViewModel @AssistedInject constructor(
    @Assisted stateHandle: SavedStateHandle,
    ...
) : BaseViewModel(stateHandle,...) {

    @AssistedInject.Factory
    interface Factory : ViewModelAssistedFactory<AnotherViewModel>
}

飞溅活动模块:

@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] ....如果没有 @Inject 构造函数或 @Provides-annotated 方法,则无法提供另一个视图模型。公共抽象接口 ApplicationComponent 扩展 dagger.android.AndroidInjector<...Application> {

我怎样才能使这项工作?

4

1 回答 1

1

好吧,我发现,只有一块拼图丢失了。
我只创建了从 ChildActivity 参数接收的 ViewModel。为了能够使用 N 个 ViewModel,ChildActivity 就像 BaseActivity 一样负责提供它们。所以,我只需要ViewModel在 SplashActivity 中添加我的实例化:

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

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

现在可以了!

于 2020-01-07T16:20:52.787 回答