我的 Android 应用程序有枚举类专业化:
enum class Specialization {
DEVELOPER, MANAGER
}
此类的值被传递到视图模型,视图模型基于此向存储库发出请求:
class EmployeesViewModel @Inject constructor(
private val typeSpecialization: Specialization,
private val getEmployeesListUseCase: GetEmployeesListUseCase
): ViewModel() {
val screenState: Flow<EmployeesFragmentScreenState> = getEmployeesListUseCase(typeSpecialization)
.filter { it.isNotEmpty() }
.map { EmployeesFragmentScreenState.Content(employees = it) as EmployeesFragmentScreenState }
.onStart { emit(EmployeesFragmentScreenState.Loading) }
}
RecycleView中点击处理:
override fun onBindViewHolder(
holder: SpecializationItemViewHolder,
position: Int
) {
val specItem = getItem(position)
val binding = holder.binding
binding.specializationName.text = specItem.specializationName
binding.idspec.text = specItem.specialty_id.toString()
binding.root.setOnClickListener {
onSpecializationClickListener?.invoke(specItem.specialty_id)
}
}
选择一个选项以转移到下一个屏幕:
private fun setupClickListener(){
specializationListAdapter.onSpecializationClickListener = {
launchEmployeesListFragment(it)
}
}
private fun launchEmployeesListFragment(typeSpecialization: Int){
val type = if(typeSpecialization == 101){
Specialization.MANAGER
}else{
Specialization.DEVELOPER
}
findNavController().navigate(SpecializationListFragmentDirections.actionSpecializationListFragmentToEmployeesListFragment(type))
}
接下来,我只需在下一个屏幕上获取特殊类型并将其传递给 ViewModel,ViewModel 通过 UseCase 向存储库发出请求。根据类型,会接收特定专业的员工。
Dagger 2 如何处理这种情况?当尝试为提供编写方法时,自然会出现错误[Dagger/DuplicateBindings]:
@Module
class DomainModule {
@Provides
fun provideSpecializationDeveloper(): Specialization {
return Specialization.DEVELOPER
}
@Provides
fun provideSpecializationManager(): Specialization {
return Specialization.MANAGER
}
}
对于这些 Dagger 使用
@Qualifier
s。
@Module
class DomainModule {
@Provides
@DeveloperSpecialization
fun provideSpecializationDeveloper(): Specialization {
return Specialization.DEVELOPER
}
@Provides
@ManagerSpecialization
fun provideSpecializationManager(): Specialization {
return Specialization.MANAGER
}
}
@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class ManagerSpecialization
@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class DeveloperSpecialization
class EmployeesViewModel @Inject constructor(
@DeveloperSpecialization private val typeSpecialization: Specialization,
private val getEmployeesListUseCase: GetEmployeesListUseCase
)