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