Ошибка [Dagger/DuplateBindings] при работе с перечислением ⇐ Android
-
Гость
Ошибка [Dagger/DuplateBindings] при работе с перечислением
Мое приложение для Android имеет специализацию класса перечисления:
Специализация класса перечисления { РАЗРАБОТЧИК, МЕНЕДЖЕР } Значения этого класса передаются в модель представления, которая на основе этого делает запрос к репозиторию:
класс СотрудникиViewModel @Inject конструктор( частный тип значения Специализация: Специализация, частный вал getEmployeesListUseCase: GetEmployeesListUseCase ): ViewModel() { val screenState: Flow = getEmployeesListUseCase(typeSpecialization) .filter { it.isNotEmpty() } .map {СотрудникиFragmentScreenState.Content(сотрудники = это) как СотрудникиFragmentScreenState } .onStart {emit(EmployeesFragmentScreenState.Loading) } } RecycleView:
переопределить удовольствие onBindViewHolder( держатель: SpecializationItemViewHolder, позиция: Интер ) { val specItem = getItem(позиция) привязка val = Holder.binding привязка.имяспециализации.текст = specItem.имяспециализации привязка.idspec.text = specItem.specialty_id.toString() привязка.root.setOnClickListener { onSpecializationClickListener?.invoke(specItem.specialty_id) } } SpecializationListFragment:
class SpecializationListFragment : Fragment() { частный var _binding: FragmentSpecializationListBinding? = ноль частная привязка val: FragmentSpecializationListBinding get() = _binding ?: throw RuntimeException("FragmentSpecializationListBinding имеет значение null") частный lateinit var специализацияListAdapter: SpecializationListAdapter @Инжект lateinit var viewModelFactory: ViewModelFactory частный компонент val от lazy{ (requireActivity().application как CoreApplication).компонент } lateinit var viewModel: SpecializationViewModel переопределить fun onAttach(context: Context) { компонент.inject(это) super.onAttach(контекст) } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentSpecializationListBinding.inflate(инфлятор, контейнер, ложь) вернуть привязку.корень } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) viewModel = ViewModelProvider(this, viewModelFactory)[SpecializationViewModel::class.java] настройкаRecyclerView() lifecycleScope.launch { repeOnLifecycle(Lifecycle.State.RESUMED){ viewModel.screenState.collect{ когда это){ это SpecializationsFragmentScreenState.Content -> { //Toast.makeText(requireContext(), "Содержимое спецификации", Toast.LENGTH_SHORT).show() привязка.progressSpecLayout.visibility = Вид.GONE специализацияListAdapter.submitList(it.specializations) } это SpecializationsFragmentScreenState.Loading -> { привязка.progressSpecLayout.visibility = Вид.VISIBLE } } } } } } личное развлечение setupRecyclerView(){ с (binding.rvSpList) { специализацияСписокАдаптер = СпециализацияСписокАдаптер() адаптер = специализацияListAdapter } настройкаClickListener() } личное развлечение setupClickListener(){ СпециализацияListAdapter.onSpecializationClickListener = { launchEmployeesListFragment(it) } } частное развлечение launchEmployeesListFragment(typeSpecialization: Int){ тип val = if(typeSpecialization == 101){ Специализация.МЕНЕДЖЕР }еще{ Специализация.РАЗРАБОТЧИК } findNavController().navigate(SpecializationListFragmentDirections.actionSpecializationListFragmentToEmployeesListFragment(тип)) } } EmployeesListFragment:
class СотрудникиListFragment : Fragment() { частный var _binding: FragmentEmployeesListBinding? = ноль частная привязка val: FragmentEmployeesListBinding get() = _binding ?: throw RuntimeException("FragmentEmployeesListBinding имеет значение null") частные аргументы val от navArgs() @Инжект lateinit var viewModelFactoryD: ViewModelFactory частный компонент val от lazy{ (requireActivity().application как CoreApplication).компонент } lateinit var viewModel: СотрудникиViewModel частный lateinit var сотрудникListAdapter: СотрудникиListAdapter переопределить fun onAttach(context: Context) { компонент.inject(это) super.onAttach(контекст) } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentEmployeesListBinding.inflate(инфлятор, контейнер, ложь) вернуть привязку.корень } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) viewModel = ViewModelProvider(this, viewModelFactoryD)[EmployeeViewModel::class.java] настройкаRecyclerView() lifecycleScope.launch { repeOnLifecycle(Lifecycle.State.RESUMED){ viewModel.screenState.collect{ когда это){ это СотрудникиFragmentScreenState.Content -> { привязка.progressLayout.visibility = Вид.GONE сотрудникListAdapter.submitList(it.employees) } это СотрудникиFragmentScreenState.Loading -> { привязка.progressLayout.visibility = Вид.VISIBLE } } } } } } личное развлечение setupRecyclerView(){ с (binding.rvEmpList) { АдаптерСпискаСотрудников =АдаптерСпискаСотрудников() адаптер = СписокАдаптеровСотрудников } настройкаClickListener() } личное развлечение setupClickListener(){ сотрудникListAdapter.onEmployeeClickListener = { launchEmployeeFragment (оно) } } частное развлечение launchEmployeeFragment (сотрудник: Сотрудник) { findNavController().navigate(EmployeesListFragmentDirections.actionEmployeesListFragmentToEmployeeFragment(сотрудник)) } } Далее я просто получаю тип специальности на следующем экране и передаю его в ViewModel, который отправляет запрос в репозиторий через UseCase. В зависимости от типа будут приниматься сотрудники определенной специальности.
Как справиться с этой ситуацией с Dagger 2? При попытке написать метод для предоставления естественно возникает ошибка [Dagger/DuplateBindings]:
@Module класс DomainModule { @Обеспечивает весело предоставитьSpecializationDeveloper(): Специализация { вернуть Специализация.РАЗРАБОТЧИК } @Обеспечивает весело обеспечитьSpecializationManager(): Специализация { возврат Специализация.МЕНЕДЖЕР } }
Мое приложение для Android имеет специализацию класса перечисления:
Специализация класса перечисления { РАЗРАБОТЧИК, МЕНЕДЖЕР } Значения этого класса передаются в модель представления, которая на основе этого делает запрос к репозиторию:
класс СотрудникиViewModel @Inject конструктор( частный тип значения Специализация: Специализация, частный вал getEmployeesListUseCase: GetEmployeesListUseCase ): ViewModel() { val screenState: Flow = getEmployeesListUseCase(typeSpecialization) .filter { it.isNotEmpty() } .map {СотрудникиFragmentScreenState.Content(сотрудники = это) как СотрудникиFragmentScreenState } .onStart {emit(EmployeesFragmentScreenState.Loading) } } RecycleView:
переопределить удовольствие onBindViewHolder( держатель: SpecializationItemViewHolder, позиция: Интер ) { val specItem = getItem(позиция) привязка val = Holder.binding привязка.имяспециализации.текст = specItem.имяспециализации привязка.idspec.text = specItem.specialty_id.toString() привязка.root.setOnClickListener { onSpecializationClickListener?.invoke(specItem.specialty_id) } } SpecializationListFragment:
class SpecializationListFragment : Fragment() { частный var _binding: FragmentSpecializationListBinding? = ноль частная привязка val: FragmentSpecializationListBinding get() = _binding ?: throw RuntimeException("FragmentSpecializationListBinding имеет значение null") частный lateinit var специализацияListAdapter: SpecializationListAdapter @Инжект lateinit var viewModelFactory: ViewModelFactory частный компонент val от lazy{ (requireActivity().application как CoreApplication).компонент } lateinit var viewModel: SpecializationViewModel переопределить fun onAttach(context: Context) { компонент.inject(это) super.onAttach(контекст) } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentSpecializationListBinding.inflate(инфлятор, контейнер, ложь) вернуть привязку.корень } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) viewModel = ViewModelProvider(this, viewModelFactory)[SpecializationViewModel::class.java] настройкаRecyclerView() lifecycleScope.launch { repeOnLifecycle(Lifecycle.State.RESUMED){ viewModel.screenState.collect{ когда это){ это SpecializationsFragmentScreenState.Content -> { //Toast.makeText(requireContext(), "Содержимое спецификации", Toast.LENGTH_SHORT).show() привязка.progressSpecLayout.visibility = Вид.GONE специализацияListAdapter.submitList(it.specializations) } это SpecializationsFragmentScreenState.Loading -> { привязка.progressSpecLayout.visibility = Вид.VISIBLE } } } } } } личное развлечение setupRecyclerView(){ с (binding.rvSpList) { специализацияСписокАдаптер = СпециализацияСписокАдаптер() адаптер = специализацияListAdapter } настройкаClickListener() } личное развлечение setupClickListener(){ СпециализацияListAdapter.onSpecializationClickListener = { launchEmployeesListFragment(it) } } частное развлечение launchEmployeesListFragment(typeSpecialization: Int){ тип val = if(typeSpecialization == 101){ Специализация.МЕНЕДЖЕР }еще{ Специализация.РАЗРАБОТЧИК } findNavController().navigate(SpecializationListFragmentDirections.actionSpecializationListFragmentToEmployeesListFragment(тип)) } } EmployeesListFragment:
class СотрудникиListFragment : Fragment() { частный var _binding: FragmentEmployeesListBinding? = ноль частная привязка val: FragmentEmployeesListBinding get() = _binding ?: throw RuntimeException("FragmentEmployeesListBinding имеет значение null") частные аргументы val от navArgs() @Инжект lateinit var viewModelFactoryD: ViewModelFactory частный компонент val от lazy{ (requireActivity().application как CoreApplication).компонент } lateinit var viewModel: СотрудникиViewModel частный lateinit var сотрудникListAdapter: СотрудникиListAdapter переопределить fun onAttach(context: Context) { компонент.inject(это) super.onAttach(контекст) } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentEmployeesListBinding.inflate(инфлятор, контейнер, ложь) вернуть привязку.корень } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) viewModel = ViewModelProvider(this, viewModelFactoryD)[EmployeeViewModel::class.java] настройкаRecyclerView() lifecycleScope.launch { repeOnLifecycle(Lifecycle.State.RESUMED){ viewModel.screenState.collect{ когда это){ это СотрудникиFragmentScreenState.Content -> { привязка.progressLayout.visibility = Вид.GONE сотрудникListAdapter.submitList(it.employees) } это СотрудникиFragmentScreenState.Loading -> { привязка.progressLayout.visibility = Вид.VISIBLE } } } } } } личное развлечение setupRecyclerView(){ с (binding.rvEmpList) { АдаптерСпискаСотрудников =АдаптерСпискаСотрудников() адаптер = СписокАдаптеровСотрудников } настройкаClickListener() } личное развлечение setupClickListener(){ сотрудникListAdapter.onEmployeeClickListener = { launchEmployeeFragment (оно) } } частное развлечение launchEmployeeFragment (сотрудник: Сотрудник) { findNavController().navigate(EmployeesListFragmentDirections.actionEmployeesListFragmentToEmployeeFragment(сотрудник)) } } Далее я просто получаю тип специальности на следующем экране и передаю его в ViewModel, который отправляет запрос в репозиторий через UseCase. В зависимости от типа будут приниматься сотрудники определенной специальности.
Как справиться с этой ситуацией с Dagger 2? При попытке написать метод для предоставления естественно возникает ошибка [Dagger/DuplateBindings]:
@Module класс DomainModule { @Обеспечивает весело предоставитьSpecializationDeveloper(): Специализация { вернуть Специализация.РАЗРАБОТЧИК } @Обеспечивает весело обеспечитьSpecializationManager(): Специализация { возврат Специализация.МЕНЕДЖЕР } }
Мобильная версия