2

我想为从@Binds 方法返回的对象使用@Named 限定符,但我注意到这只能通过静态提供方法实现,而在实际实现中我无法弄清楚。所以下面是我想要实现的。

我有一个自定义 UserScope,它将包含用户登录后的所有活动/片段/viewModel,我在 AuthViewModelModule 中有 LoginViewModel,在 UserViewModelModule 中有另一个 VM,VMModule 都绑定 VMProvider.Factory,因此我需要有 @Named 限定符VMFactory 实例,所以我可以在各自的活动/片段中注入 @Named 。

@Module
internal abstract class AuthViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    internal abstract fun bindLoginViewModel(loginViewModel: LoginViewModel): ViewModel

    @Binds
    internal abstract fun bindViewModelFactory(factory: AuthViewModelFactory):
        ViewModelProvider.Factory
}

@Module
internal abstract class UserViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(LeadViewModel::class)
    internal abstract fun bindLeadViewModel(leadViewModel: LeadViewModel): ViewModel

    @Binds
    internal abstract fun bindViewModelFactory(factory: UserViewModelFactory):
        ViewModelProvider.Factory
}
4

2 回答 2

6

为您的提供者方法添加限定符:

@Binds
@Named("Auth")
internal abstract fun bindViewModelFactory(factory: AuthViewModelFactory): ViewModelProvider.Factory

@Binds
@Named("User")
internal abstract fun bindViewModelFactory(factory: UserViewModelFactory): ViewModelProvider.Factory

这是棘手的部分:注入时,您必须使用以下语法:

@Inject
@field:Named("Auth")
internal lateinit var factory: ViewModelProvider.Factory

@Inject
@field:Named("User")
internal lateinit var factory: ViewModelProvider.Factory
于 2018-02-23T12:40:56.063 回答
0

您可以像这样将@Named 注入到 kotlin 活动中:

@JvmField
@Inject
@field:Named("PARAMETER_NAME")
var something: Boolean = false

或者像这样对于非原始值:

@JvmField
@Inject
@field:Named("PARAMETER_NAME")
lateinit var something: SomeType
于 2021-08-18T02:25:35.050 回答