2016-07-03 16 views
5

Quando si aggiungono sia Dagger 2 e Android Data Binding al mio progetto, si verificano alcuni errori di compilazione riportati di seguito. Sembra che questo sia un problema noto (vedi [1] o [2]) poiché ottengo gli stessi errori. Sfortunatamente non ero in grado di risolverli (come altri). Qualcuno ha una piena configurazione di lavoro con le versioni correnti di Dagger 2 e Data Binding e può aiutare?Conflitto di Dagger 2 e Android Data Binding

Qui gli errori:

 
C:\Users\Kai\AndroidStudioProjects\WearCompass\mobile\src\main\java\com\comparilla\wearcompass\ui\navigation\InfoPanelFragment.java:12: error: package com.comparilla.wearcompass.databinding does not exist 
import com.comparilla.wearcompass.databinding.FragmentInfoPanelBinding; 
              ^
C:\Users\Kai\AndroidStudioProjects\WearCompass\mobile\src\main\java\com\comparilla\wearcompass\ui\navigation\InfoPanelViewModel.java:8: error: cannot find symbol 
import com.comparilla.wearcompass.BR; 
           ^
    symbol: class BR 
    location: package com.comparilla.wearcompass 
C:\Users\Kai\AndroidStudioProjects\WearCompass\mobile\src\main\java\com\comparilla\wearcompass\MobileApplication.java:7: error: cannot find symbol 
import com.comparilla.wearcompass.di.components.DaggerMobileApplicationComponent; 
              ^
    symbol: class DaggerMobileApplicationComponent 
    location: package com.comparilla.wearcompass.di.components 
C:\Users\Kai\AndroidStudioProjects\WearCompass\mobile\src\main\java\com\comparilla\wearcompass\di\components\MobileActivityComponent.java:15: error: com.comparilla.wearcompass.common.services.HeadingService cannot be provided without an @Inject constructor or from an @Provides-annotated method. 
    void inject(InfoPanelFragment fragment); 
     ^
     com.comparilla.wearcompass.common.services.HeadingService is injected at 
      com.comparilla.wearcompass.di.modules.ActivityModule.provideInfoPanelViewModel(headingService, …) 
     com.comparilla.wearcompass.ui.navigation.InfoPanelViewModel is injected at 
      com.comparilla.wearcompass.ui.navigation.InfoPanelFragment.mViewModel 
     com.comparilla.wearcompass.ui.navigation.InfoPanelFragment is injected at 
      com.comparilla.wearcompass.di.components.MobileActivityComponent.inject(fragment) 
4 errors 

FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':mobile:compileDebugJavaWithJavac'. 
> Compilation failed; see the compiler error output for details. 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Il mio progetto build.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.1.2' 
     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 
} 

E il build.gradle applicazione:

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

android { 
    compileSdkVersion 24 
    buildToolsVersion "23.0.3" 

    dataBinding { 
     enabled = true 
    } 
    defaultConfig { 
     applicationId "com.comparilla.wearcompass" 
     minSdkVersion 21 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    wearApp project(':wear') 
    testCompile 'junit:junit:4.12' 

    // to enable BuildConfig.DEBUG in the common library 
    // see https://stackoverflow.com/a/29163361/166229 
    releaseCompile project(path: ':common', configuration: 'release') 
    debugCompile project(path: ':common', configuration: 'debug') 

    compile 'com.android.support:appcompat-v7:24.0.0' 
    compile 'com.google.android.gms:play-services-maps:9.0.2' 
    compile 'com.android.support:design:24.0.0' 
    compile 'com.android.support:preference-v14:24.0.0' 

    compile 'com.google.dagger:dagger:2.5' 
    apt 'com.google.dagger:dagger-compiler:2.5' 
    provided 'javax.annotation:jsr250-api:1.0' 
} 

Ho anche cercato di provided invece di apt in apt 'com.google.dagger:dagger-compiler:2.5', senza successo. Anche commentare apply plugin: 'com.neenbedankt.android-apt' non ha aiutato (come suggerito nelle risorse fornite).

risposta

5

Ho Dagger 2 e DataBinding configurati nello stesso progetto e funzionano senza problemi.

Si è verificato un errore nella configurazione di Dagger 2. Lo HeadingService che stai tentando di iniettare non può essere creato perché non lo hai fornito con l'annotazione @Provides e anche la classe non ha l'annotazione @Inject sul costruttore.

+1

Hai ragione. Sembra che ci sia qualcosa di sbagliato nelle mie iniezioni. Ero così concentrato su quell'errore di binding e su alcune vecchie segnalazioni di bug, che ho trascurato la vera causa. Grazie per aver aperto i miei occhi! – Zardoz

Problemi correlati