【问题标题】:Dagger 2 Kotlin - @Named qualifier for @Binds methodDagger 2 Kotlin - @Binds 方法的 @Named 限定符
【发布时间】:2018-02-22 09:56:03
【问题描述】:

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

我有一个自定义的 UserScope,它将包含用户登录后的所有活动/片段/viewModel,我在 AuthViewModelModule 中有 LoginViewModel,在 UserViewModelModule 中有另一个 VM,VMModule 都绑定 VMProvider.Factory,因此我需要 @ 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
}

【问题讨论】:

    标签: kotlin dagger-2 custom-scope


    【解决方案1】:

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

    @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
    

    【讨论】:

    • 但是为什么呢? @field: 在这里做什么?
    • 在 kotlin 中,一个 var 由一个 getter 方法、一个 setter 方法和一个字段组成,因此您需要使用注释直接寻址字段。不过,此要求已在 Dagger 的更高版本中删除。
    【解决方案2】:

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

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

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

    @JvmField
    @Inject
    @field:Named("PARAMETER_NAME")
    lateinit var something: SomeType
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2023-03-25
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多