2017-07-13 1 views
1

Je suis en train d'utiliser la dernière version de Dagger 2 V2.11 pour Android Voici mon code:
AppComponent:Dagger 2 pour Android « ne peut pas être fourni sans @ Fournit annotée méthode »

@Singleton 
@Component(modules = { 
     AndroidInjectionModule.class, 
     AppModule.class, 
     ActivityBuildersModule.class, 
     FragmentBuildersModule.class 
}) 
public interface AppComponent { 
    void inject(MyApplication myApplication); 

    @Component.Builder 
    interface Builder { 
     @BindsInstance 
     Builder application(Application application); 

     AppComponent build(); 
    } 

    @ExceptionRequestsQualifier 
    ExceptionRequestsServices exceptionRequestsServices(); 

} 

AppModule:

@Module(includes = {ActivityModule.class, FragmentModule.class}) 
public class AppModule { 

    @Provides 
    CompositeDisposable provideCompositeDisposable() { 
     return new CompositeDisposable(); 
    } 

    @Provides 
    @ExceptionRequestsQualifier 
    ExceptionRequestsServices provideExceptionRequests() { 
     return new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
       .baseUrl(APIConstants.EXCEPTION_REQUESTS_BASE_URL) 
       .build() 
       .create(ExceptionRequestsServices.class); 
    } 

    @Singleton 
    @Provides 
    NetworkManager provideNetworkManager(Application app) { 
     return new NetworkManager(app); 
    } 

} 

ActivityBuildersModule:

@Module 
public abstract class ActivityBuildersModule { 

    @ActivityScope 
    @ContributesAndroidInjector 
    abstract ExceptionRequestsActivity contributeExceptionRequestsActivity(); 

} 

ActivityModule:

@Module() 
public abstract class ActivityModule { 

    @Provides 
    @ActivityScope 
    static ExceptionRequestsMvpPresenter<ExceptionRequestsMvpView> bindExceptionRequestsPresenter(
      ExceptionRequestsPresenter<ExceptionRequestsMvpView> presenter) { 
     return presenter; 
    } 

} 

FragmentBuildersModule:

@Module 
public abstract class FragmentBuildersModule { 

    @FragmentScope 
    @ContributesAndroidInjector 
    abstract AddApplicantFragment contributeAddApplicantFragment(); 

    @FragmentScope 
    @ContributesAndroidInjector 
    abstract PledgeFragment contributePledgeFragment(); 

} 

FragmentModule:

@Module() 
public abstract class FragmentModule { 

    @Provides 
    @FragmentScope 
    static AddApplicantMvpPresenter<AddApplicantMvpView> bindAddApplicantPresenter(
      AddApplicantPresenter<AddApplicantMvpView> presenter) { 
     return presenter; 
    } 

    @Provides 
    @FragmentScope 
    static PledgeMvpPresenter<PledgeMvpView> bindPledgePresenter(
      PledgePresenter<PledgeMvpView> presenter) { 
     return presenter; 
    } 

} 

AddApplicantPresenter:

public class AddApplicantPresenter<V extends AddApplicantMvpView> extends BasePresenter<V> implements AddApplicantMvpPresenter<V> { 

    @Inject 
    @ExceptionRequestsQualifier 
    ExceptionRequestsServices mExceptionRequestsServices; 

    @Inject 
    NetworkManager mNetworkManager; 

    @Inject 
    public AddApplicantPresenter(CompositeDisposable compositeDisposable) { 
     super(compositeDisposable); 
    } 

} 

AddApplicantMvpPresenter:

@FragmentScope 
public interface AddApplicantMvpPresenter<V extends AddApplicantMvpView> extends MvpPresenter<V> { 

    void addApplicant(String name, String qatarId, 
         String date, String mobile, 
         ChosenImage chosenImage); 

} 

ActivityScope:

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ActivityScope { 
} 

FragmentScope:

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FragmentScope { 
} 

Error Log:

Error:(21, 1) error: mypackagename.di.component.AppComponent scoped with @Singleton may not reference bindings with different scopes: 
@Provides @mypackagename.di.scope.ActivityScope mypackagename.ui.exceptionrequests.ExceptionRequestsMvpPresenter<mypackagename.ui.exceptionrequests.ExceptionRequestsMvpView> mypackagename.di.module.ActivityModule.bindExceptionRequestsPresenter(mypackagename.ui.exceptionrequests.ExceptionRequestsPresenter<mypackagename.ui.exceptionrequests.ExceptionRequestsMvpView>) 
@Provides @mypackagename.di.scope.FragmentScope mypackagename.ui.addapplicant.AddApplicantMvpPresenter<mypackagename.ui.addapplicant.AddApplicantMvpView> mypackagename.di.module.FragmentModule.bindAddApplicantPresenter(mypackagename.ui.addapplicant.AddApplicantPresenter<mypackagename.ui.addapplicant.AddApplicantMvpView>) 
@Provides @mypackagename.di.scope.FragmentScope mypackagename.ui.pledge.PledgeMvpPresenter<mypackagename.ui.pledge.PledgeMvpView> mypackagename.di.module.FragmentModule.bindPledgePresenter(mypackagename.ui.pledge.PledgePresenter<mypackagename.ui.pledge.PledgeMvpView>) 
+0

Copie possible de [Comment corriger l'erreur Dagger 2 '... impossible à fournir \ [... \]'?] (Https://stackoverflow.com/questions/44912080/how-do-i- fix-dagger-2-error-can-be-provided) –

+0

Vous ne fournissez que '@ExceptionRequestsQualifier ExceptionRequestsServices' mais votre composant tente d'exposer' ExceptionRequestsServices', dont il ne connaît pas l'existence. –

+0

@DavidMedenjak J'ai ajouté '@ ExceptionRequestsQualifier' à' ExceptionRequestsServices' et j'ai mis à jour mon journal des questions et erreurs. –

Répondre

2

Modules & Les composants ne peuvent pas avoir d'étendue différente. Vous pouvez avoir des Composants pour avoir plusieurs portées et cela peut le résoudre. Essayez de le déplacer vers un autre composant et ajoutez-le en tant que composant dépendenc

J'espère qu'à l'avenir, ils peuvent résoudre ce problème. la façon dont je l'ai fait dans mon projet Actuellement Dagger2 permet module avec NoScope & portée unique cela devrait correspondre avec vos composants.

Règle du pouce :: Les différentes portées ont des composants différents. Pour votre application vous avez besoin de trois composants FragmentComponent (FragmentScope): - (Idéalement, cela devrait être ActivityComponent) ApplicationComponet (Singleton)

https://medium.com/@patrykpoborca/making-a-best-practice-app-4-dagger-2-267ec5f6c89a En savoir plus sur les étendues.