2017-07-27 10 views
0

Je travaille avec l'architecture Code Viper MVP -Le présentateur ne peut pas être fourni sans une méthode @ Provides- ou @ Produces-annotated | Android | Dagger 2

Quand je compile le code que je reçois ce ERROR-

Error:(32, 10) error: com.tv.goin.activities.login.LoginMvpPresenter<com.tv.goin.activities.logi n.LoginMvpView,com.tv.goin.activities.login.LoginMvpInteractor> 
cannot be provided without an @Provides- or @Produces-annotated method. 
    com.tv.goin.activities.login.LoginMvpPresenter<com.tv.goin.activities.login.LoginMvpView,com.tv.goin.activities.login.LoginMvpInteractor> is injected at 
    com.tv.goin.activities.login.LoginActivity.mPresenter 
    com.tv.goin.activities.login.LoginActivity is injected at 
    com.tv.goin.di.component.ActivityComponent.inject(activity) 

Voici mon fichier Gradle -

apply plugin: 'com.android.application' 
//apply plugin: 'com.neenbedankt.android-apt' 


android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 
    defaultConfig { 
     applicationId "com.tv.goin" 
     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion rootProject.ext.targetSdkVersion 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     vectorDrawables.useSupportLibrary = true 

    } 
    buildTypes { 
     debug { 
      buildConfigField("String", "BASE_URL", "\"http://www.mocky.io/v2\"") 
      buildConfigField("String", "API_KEY", "\"ABCXYZ123TEST\"") 
     } 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
      buildConfigField("String", "BASE_URL", "\"http://www.mocky.io/v2\"") 
      buildConfigField("String", "API_KEY", "\"ABCXYZ123TEST\"") 
     } 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 

    // android support libraries 
    compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" 
    compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion" 
    compile "com.android.support:cardview-v7:$rootProject.supportLibraryVersion" 
    compile "com.android.support:design:$rootProject.supportLibraryVersion" 
    compile "com.android.support:support-vector-drawable:$rootProject.supportLibraryVersion" 
    compile "com.android.support:animated-vector-drawable:$rootProject.supportLibraryVersion" 

    // font 
    compile "uk.co.chrisjenx:calligraphy:$rootProject.calligraphyVersion" 

    // network 
    compile "com.amitshekhar.android:rx2-android-networking:$rootProject.rx2FastAndroidNetworking" 

    // image 
    compile "com.github.bumptech.glide:glide:$rootProject.glideVersion" 

    // parser 
    compile "com.google.code.gson:gson:$rootProject.gsonVersion" 

    // database 
    compile "org.greenrobot:greendao:$rootProject.greenDaoVersion" 

    // debug database 
    debugCompile "com.amitshekhar.android:debug-db:$rootProject.debugDBVersion" 

    // dependency injection 
    compile "com.google.dagger:dagger:$rootProject.dagger2Version" 
    annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version" 
    provided 'javax.annotation:jsr250-api:1.0' 
    compile 'javax.inject:javax.inject:1' 

    // reactive 
    compile "io.reactivex.rxjava2:rxjava:$rootProject.rxjava2Version" 
    compile "io.reactivex.rxjava2:rxandroid:$rootProject.rxandroidVersion" 

    // code generator for view 
    compile "com.jakewharton:butterknife:$rootProject.butterKnifeVersion" 
    annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion" 

    // swipe view 
    compile "com.mindorks:placeholderview:$rootProject.placeholderviewVersion" 

    // logger 
    compile "com.jakewharton.timber:timber:$rootProject.timberVersion" 

    // dependencies for local unit tests 
    testCompile "junit:junit:$rootProject.ext.junitVersion" 
    testCompile "org.mockito:mockito-core:$rootProject.mockitoVersion" 
    testAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version" 

    // UI Testing 
    androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion" 
    androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.espressoVersion" 
    androidTestCompile "org.mockito:mockito-core:$rootProject.mockitoVersion" 
    androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version" 
} 

configurations.all { 
    resolutionStrategy.force "com.android.support:support-annotations:$supportLibraryVersion" 
} 

Voici mon niveau racine Gradle -

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.3.0' 
//  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

// Define versions in a single place 
ext { 
    // Sdk and tools 
    minSdkVersion = 16 
    targetSdkVersion = 25 
    compileSdkVersion = 25 
    buildToolsVersion = '25.0.2' 

    // App dependencies 
    supportLibraryVersion = '25.3.1' 
    gsonVersion = '2.8.0' 
    calligraphyVersion = '2.2.0' 
    glideVersion = '3.7.0' 

    rx2FastAndroidNetworking = '1.0.0' 

    dagger2Version = '2.8' 
    rxjava2Version = '2.0.6' 
    rxandroidVersion = '2.0.1' 
    butterKnifeVersion = '8.6.0' 
    greenDaoVersion = '3.2.0' 
    placeholderviewVersion = '0.6.1' 
    debugDBVersion = '1.0.0' 
    timberVersion = '4.5.1' 

    //Test dependencies 
    junitVersion = '4.12' 
    espressoVersion = '2.2.2' 
    mockitoVersion = '2.7.1' 
} 

EDIT

  • LoginMvpPresenter paquet classe

    com.tv.goin.activities.login;

    import com.tv.goin.BaseClasses.MvpPresenter; 
    import com.tv.goin.di.PerActivity; 
    
    /** 
    * Created by Shoeb on 26/7/17. 
    */ 
    @PerActivity 
    public interface LoginMvpPresenter<V extends LoginMvpView, 
         I extends LoginMvpInteractor> extends MvpPresenter<V,I> { 
    
    } 
    
+0

Pouvez-vous partager votre'LoginMvpPresenter'? – StuStirling

+0

@StuStirling J'ai ajouté cette classe s'il vous plaît vérifier :) –

+0

Comme c'est une interface que vous essayez de fournir, vous devez le définir dans un module et l'annoter avec l'annotation @Provides. Si vous fournissez la classe que vous essayez de l'injecter ainsi que votre structure DI, comme vos modules et composants, je ferai de mon mieux pour vous aider. – StuStirling

Répondre

0

Comme je ne connais pas la structure de votre graphe de dépendance ou comment vous injecter ces dépendances, je ne peux vous donner l'exemple générique. Aussi, je ne suis pas sûr de la tête de la façon dont cela fonctionne avec les génériques comme vous l'avez spécifié sur votre interface.

Vous essayez de fournir une interface qui n'a pas d'implémentation. Vous devez définir l'objet que vous allez retourner qui implémente votre interface dans un Module. Comme cette interface est un Presenter, je suppose qu'il est utilisé dans une activité ou un fragment.

Dans votre Activity créer une classe interne comme ce qui suit:

@dagger.Module 
class Module { 
    @Provides 
    public LoginMvpPresenter<Class> providesPresenter() { 
     return new LoginMvpPresenterImpl(); 
    } 
} 

Puis aussi une interface interne créer un composant.

@dagger.Component { 
    dependencies = AppComponent.class, 
    modules = { 
     Module.class 
    } 
} 
interface Component { 
    void inject(MyActivity activity); 
} 

Maintenant, votre activité sait comment créer la dépendance et où tout ce que vous devez faire l'injection est injecter votre classe que vous pouvez faire de la onCreate vous Activity comme ceci.

DaggerMyActivity_Component.builder() 
    .appComponent(getAppComponent()) 
    .build() 
    .inject(this); 

Maintenant, vous pouvez utiliser l'annotation @Inject et déclarer votre présentateur comme un champ de votre classe Activity.