代码之家  ›  专栏  ›  技术社区  ›  Saber Solooki

继承、泛型和匕首2

  •  1
  • Saber Solooki  · 技术社区  · 7 年前

    我有两种碎片。其中之一是 ListFragment 另一个是 ListWithFilterFragment 那个 ListWithFilterFragment extend ListFragment . 我还有两个演示者来演示这些片段 ListWithFilterPresenter extend ListPresenter . 所以我为presenter定义了单独的模块,并在Dagger中定义了单独的组件。我想将正确的演示者注入到这些片段中,但出现了错误

    这是 列表片段 :

    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)错误:com。未醉appModules。列表节目主持人如果没有对@Provides或@products进行注释,则无法提供ListPresenter。方法通用域名格式。未醉appModules。列表节目主持人ListPresenter被注入 通用域名格式。未醉appModules。列表用户界面。ListFragment。节目主持人 通用域名格式。未醉appModules。列表用户界面。ListWithFilterFragment在com中注入。未醉appModules。列表注射ListWithFilterComponent。注入(片段)

    1 回复  |  直到 7 年前
        1
  •  2
  •   David Medenjak    7 年前

    匕首不能进行部分注射。要么它可以提供所有对象,要么它将失败 无法提供 .

    在你的情况下 ListWithFilterComponent 无法提供 ListPresenter ListWithFilterFragment -或者更确切地说 ListFragment 父母亲

    请参见行末尾的注释

    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
    

    如果要保持当前设置,需要提供 ListPresenter 从您的 ListWithFilterComponent列表 同样,否则您将需要重构您的片段,以便它们不会彼此扩展。