gpt4 book ai didi

java - 继承和泛型以及 Dagger2

转载 作者:行者123 更新时间:2023-12-02 11:38:58 26 4
gpt4 key购买 nike

我有两种 fragment 。其中之一是 ListFragment,另一个是 ListWithFilterFragmentListWithFilterFragment 扩展了 ListFragment。另外,我还有两个用于这些 fragment 的演示者,ListWithFilterPresenter 扩展了 ListPresenter。所以我在 Dagger 中为演示者和单独的组件定义了单独的模块。我想向这些 fragment 注入(inject)正确的演示者,但出现错误

这是ListFragment:

public class ListFragment<V extends ListView> extends BaseFragment<V, ListPresenter<V>> implements ListView {
@Inject
ListPresenter presenter;

@NonNull
@Override
public ListPresenter createPresenter() {
DaggerListComponent.builder().build().inject((ListFragment<ListView>) this);
return presenter;
}

这是ListWithFilterFragment:

public class ListWithFilterFragment extends ListFragment<ListWithFilterView> implements ListWithFilterView {
@Inject
ListWithFilterPresenter presenter;

@NonNull
@Override
public ListWithFilterPresenter createPresenter() {
DaggerListWithFilterComponent.builder().build().inject(this);
return presenter;
}
}

这是ListComponent:

@Singleton
@Component(modules = {ListPresenterModule.class,
ListInteractorModule.class})
public interface ListComponent {
void inject(ListFragment<ListView> fragment);
}

这是ListWithFilterComponent:

@Singleton
@Component(modules = {ListWithFilterPresenterModule.class,
ListInteractorModule.class})
public interface ListWithFilterComponent {
void inject(ListWithFilterFragment fragment);
}

和我的演示者模块

@Module
public class ListWithFilterPresenterModule {
@Provides @NonNull @Singleton
public ListWithFilterPresenter providePresenter(ListInteractor interactor) {
return new ListWithFilterPresenter(interactor);
}
}

@Module
public class ListPresenterModule {
@Provides @NonNull @Singleton
public ListPresenter providePresenter(ListInteractor interactor) {
return new ListPresenter(interactor);
}
}

Error:(16, 10) error: com.sober.appModules.List.presenter.ListPresenter cannot be provided without an @Provides- or @Produces-annotated.method.com.sober.appModules.List.presenter.ListPresenter is injected at com.sober.appModules.List.ui.ListFragment.presenter com.sober.appModules.List.ui.ListWithFilterFragment is injected at com.sober.appModules.List.injection.ListWithFilterComponent.inject(fragment)

最佳答案

Dagger 不进行部分注入(inject)。它要么可以提供所有对象,要么会失败并显示无法提供

在您的情况下,ListWithFilterComponent 无法向 ListWithFilterFragment 或其 ListFragment 父级提供 ListPresenter

查看行尾的注释

error: List.presenter.ListPresenter cannot be provided without an @Provides- or @Produces-annotated.method.
List.presenter.ListPresenter is injected at <- missing object
List.ui.ListFragment.presenter <- field in parent that is getting injected
List.ui.ListWithFilterFragment is injected at <- object it tries to inject
List.injection.ListWithFilterComponent.inject(fragment) <- component that's missing something

如果您想保留当前设置,您还需要从 ListWithFilterComponent 提供 ListPresenter,否则您将需要重构您的 fragment ,以便它们不不要互相扩展。

关于java - 继承和泛型以及 Dagger2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48713683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com