Dagger 2 Kotlin - квалификатор @Named для метода @Binds

Я хотел иметь спецификатор @Named для объекта, который возвращается из метода @Binds, но я заметил, что это возможно только через статический метод обеспечивает, что я не смог понять в практической реализации. Итак, вот что я хотел достичь.

У меня есть пользовательский UserScope, который будет содержать все действия / фрагменты / viewModel после входа пользователя в систему. У меня есть LoginViewModel в AuthViewModelModule и LeadViewModel - другая виртуальная машина в UserViewModelModule, и 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
}

2 ответа

Добавьте классификатор в методы вашего провайдера:

@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

Вы можете ввести @Named в активность kotlin следующим образом:

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

или как это для непримитивных значений:

      @JvmField
@Inject
@field:Named("PARAMETER_NAME")
lateinit var something: SomeType
Другие вопросы по тегам