Рукоять с использованием 2 компонентов в одной точке входа в Android
Я новичок в Hilt (и кинжале), и я не уверен, действительно ли название является моей проблемой, но это отправная точка,
Я пытаюсь использовать рукоять адаптера представления ресайклера, для этого нужны 4 вещи: интерфейс, скольжение (загрузчик изображений), класс типа, которым я владею, и идентификатор String, я настроил для него компоненты и модули и добавил Builder для идентификатора, похоже, это работает, поскольку я могу аннотировать конструктор адаптеров, и он компилируется, но мне нужен доступ к адаптеру в моем фрагменте, поэтому я подумал, что могу просто аннотировать поле адаптера с помощью @Inject, но когда я добавлю это не работает (ошибка ниже), поэтому вот фрагмент моего фрагмента
@AndroidEntryPoint
public class CardHolderFragment extends Fragment implements ItemTouchListener,
SwipeRefreshLayout.OnRefreshListener {
@Inject
public CardAdapter cardAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
DaggerCardAdapterComponent.builder()
.cardAdapterDependencies(() -> layoutIdentifier)
.build()
.inject(this);
DaggerSentenceViewModelComponent.builder()
.context(getActivity())
.appDependencies(() -> args)
.build()
.inject(this);
и я получаю ошибку
/Users/martinseal/StudioProjects/SimpleAAC/app/src/main/java/com/xxx/SentenceViewModelComponent.java:14:
error: [Dagger/MissingBinding]
com.xxx.ItemTouchListener cannot be provided without an @Provides-annotated method.
public interface SentenceViewModelComponent {
^
com.xxx.ItemTouchListener is injected at
com.xxx.CardAdapter(onItemTouchListener, …)
com.xxx.CardAdapter is injected at
com.xxx.CardHolderFragment.cardAdapter
com.xxx.CardHolderFragment is injected at
com.xxx.SentenceViewModelComponent.inject(com.xxx.CardHolderFragment)
/Users/martinseal/StudioProjects/SimpleAAC/app/src/main/java/
com/xxx/CardAdapterComponent.java:13: error:
[Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
Итак, я вижу, что это говорит мне о проблеме, связанной с отсутствием метода обеспечения для ItemTouchListener (который я добавил безрезультатно) для SentenceViewModelComponent и CardAdapterComponent, но почему они должны быть связаны в этом графе зависимостей? Они оба вводятся в один и тот же CardHolderFragment, вот мой CardAdapterComponent:
@Singleton
@Component(dependencies = CardAdapterDependencies.class, modules = {TypeFactoryModule.class, ItemTouchListenerModule.class, GlideModule.class})
public interface CardAdapterComponent {
void inject(CardHolderFragment cardHolderFragment);
@Component.Builder
interface Builder {
Builder cardAdapterDependencies(CardAdapterDependencies cardAdapterDependencies);
CardAdapterComponent build();
}
}
как вы можете видеть, он полагается на некоторые модули фабрики первого типа
@Module
@InstallIn(ActivityComponent.class)
public abstract class TypeFactoryModule {
@Binds
abstract TypeFactory bindTypeFactory(TypeFactoryForList typeFactoryForList);
}
затем элемент сенсорного слушателя
@Module
@InstallIn(ActivityComponent.class)
public abstract class ItemTouchListenerModule {
@Binds
abstract ItemTouchListener bindItemTouchListener(CardHolderFragment cardHolderFragment);
}
а затем скользить
@Module
@InstallIn(ApplicationComponent.class)
public class GlideModule {
@Singleton
@Provides
public static RequestManager provideGlideRequestManager(@ApplicationContext Context context) {
return Glide.with(context);
}
}
а затем зависимости для компонента
@EntryPoint
@InstallIn(ApplicationComponent.class)
public interface CardAdapterDependencies {
@LayoutIdentifier String layoutIdentifier();
}
LayoutIdentifier - это квалификатор с RetentionPolicy of RUNTIME, который квалифицирует мой модуль идентификатора макета.
@Module
@InstallIn(ApplicationComponent.class)
public class LayoutIdentifierModule {
@Singleton
@Provides
@LayoutIdentifier
public String provideLayoutIdentifier(){ return Constants.MAIN_IDENTIFIER; };
}
мой SentenceViewModelComponent не полагается ни на один из этих
@Singleton
@Component(dependencies = SentenceViewModelDependencies.class)
public interface SentenceViewModelComponent {
void inject(CardHolderFragment cardHolderFragment);
@Component.Builder
interface Builder {
Builder context(@BindsInstance Context context);
Builder appDependencies(SentenceViewModelDependencies sentenceViewModelDependencies);
SentenceViewModelComponent build();
}
}
но имеет зависимость от SentenceViewModelDependencies
@EntryPoint
@InstallIn(ApplicationComponent.class)
public interface SentenceViewModelDependencies {
@SentenceTypeAndDescription String[] sentenceTypeAndDescription();
}
который имеет квалификатор SentenceTypeAndDescription, который аннотирует модуль SentenceTypeAndDescriptionModule
@Module
@InstallIn(ApplicationComponent.class)
public class SentenceTypeAndDescriptionModule {
@Singleton
@Provides
@SentenceTypeAndDescription
public String[] provideSentenceTypeAndDescription(){ return new String[]{Constants.QUICKS, "PRONOUNS"}; };
}
Я не понимаю, как связана ошибка, кроме того, что они оба вводят один и тот же фрагмент, есть ли что-то, чего мне не хватает, может быть, вокруг подкомпонентов, которые я должен использовать здесь? любая помощь будет оценена