简体   繁体   English

继承与泛型和Dagger2

[英]inheritance and generic and Dagger2

I have two kind of fragment. 我有两种片段。 One of them is ListFragment and the other one is ListWithFilterFragment that ListWithFilterFragment extend ListFragment . 其中之一是ListFragment ,另一个是ListWithFilterFragmentListWithFilterFragment extend ListFragment Also I have two presenter for these fragments that ListWithFilterPresenter extend ListPresenter . 我还为ListWithFilterPresenter extend ListPresenter这些片段提供了两个演示ListWithFilterPresenter extend ListPresenter So I define separate module for presenter and separate component in Dagger. 因此,我为演示者定义了单独的模块,并在Dagger中定义了单独的组件。 I want to inject correct presenter to these fragment but I got error 我想向这些片段注入正确的演示者,但出现错误

this is ListFragment : 这是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;
}

this is ListWithFilterFragment : 这是ListWithFilterFragment

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

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

this is ListComponent : 这是ListComponent

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

this is ListWithFilterComponent : 这是ListWithFilterComponent

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

and my presenters modules 和我的主持人模块

@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) 错误:(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)处注入

Dagger does not do partial injections. 匕首不进行部分注入。 Either it can provide all the objects, or it will fail with cannot be provided . 它可以提供所有对象,否则将无法提供失败。

In your case ListWithFilterComponent cannot provide ListPresenter to ListWithFilterFragment —or rather its ListFragment parent. 你的情况ListWithFilterComponent不能提供ListPresenterListWithFilterFragment -或者更确切地说,它ListFragment父母。

see comments at the end of the lines 在行末查看注释

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

If you want to keep your current setup you will need to provide ListPresenter from your ListWithFilterComponent as well, or otherwise you will need to refactor your fragments so that they don't extend one another. 如果要保留当前设置,则还需要从ListWithFilterComponent提供ListPresenter ,否则,您将需要重构片段,以使它们不会彼此扩展。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM