【问题标题】:inheritance and generic and Dagger2继承和泛型和 Dagger2
【发布时间】:2018-07-20 16:29:51
【问题描述】:

我有两种片段。其中一个是ListFragment,另一个是ListWithFilterFragment,即ListWithFilterFragment extend ListFragment。我也有两个演示者来处理这些片段ListWithFilterPresenter extend ListPresenter。所以我在 Dagger 中为演示者和单独的组件定义了单独的模块。我想向这些片段注入正确的演示者,但出现错误

这是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);
    }
}

错误:(16, 10) 错误:如果没有 @Provides- 或 @Produces-annotated.method.com.sober.appModules.List.presenter.ListPresenter,则无法提供 com.sober.appModules.List.presenter.ListPresenter被注射在 com.sober.appModules.List.ui.ListFragment.presenter com.sober.appModules.List.ui.ListWithFilterFragment 在 com.sober.appModules.List.injection.ListWithFilterComponent.inject(fragment) 处注入

【问题讨论】:

  • createPresenter 是基类中的方法吗?
  • 是的,这是抽象基类中的抽象方法

标签: java android generics inheritance dagger-2


【解决方案1】:

Dagger 不进行部分注射。要么它可以提供所有的对象,要么它会因为无法提供而失败。

在您的情况下,ListWithFilterComponent 无法将 ListPresenter 提供给 ListWithFilterFragment,或者更确切地说是其 ListFragment 父级。

见行尾的 cmets

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,否则您需要重构您的片段,以便它们不会相互扩展。

【讨论】:

  • 好的。感谢您的答复。但是我的 ListWithFilterPresenter 扩展了 ListPresenter。为什么我需要再次注入 ListPresenter?当我使用 ListWithFilterFragment 时,我需要 Dagger 只注入 ListWithFilterPresenter 而不是 ListPresenter。你说 Dagger 做不到?
  • @Saber Dagger 将注入 整个 对象,这包括父对象的任何属性。它不能只注入子类,不。您不应该再次注入ListPresenter,而是重构您的代码并解决这种父子关系,因为这两个类似乎不应该与我相关
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多