2015-03-22 10 views
9

Sto tentando di compilare https://github.com/svenjacobs/android-dagger2-example ma sto correndo in un errore relativo al componente non spillato in base ai componenti dell'ambito. (Android Studio 1.1, Gradle 2.2.1). Anche se qualcuno conosce altri esempi di Android di Dagger2 CON FRAMMENTI vorrei sapere su di loro.Componente Dagger2 (senza ambito) non può dipendere da componenti con ambito - Errore

UPDATE: Ecco un altro esempio uno molto semplice, con frammenti: https://github.com/gk5885/dagger-android-sample

/Users/Mac1/android-dagger2-example-master/app/src/main/java/com/svenjacobs/dagger2/ActivityComponent.java 
Error:(15, 1) error: com.svenjacobs.dagger2.ActivityComponent (unscoped) cannot depend on scoped components: 
@Singleton com.svenjacobs.dagger2.ApplicationComponent 
Error:Execution failed for task ':app:compileDebugJava'. 
> Compilation failed; see the compiler error output for details. 

Ecco l'ActivityComponent di file che non è apparentemente ambito:

import dagger.Component; 

/** 
* Component for all activities. 
* 
* @author Sven Jacobs 
*/ 
@Component(dependencies = ApplicationComponent.class, 
     modules = { 
       MainActivityModule.class, 
       AModule.class, 
       BModule.class 
     }) 
interface ActivityComponent extends AFragment.Injector, BFragment.Injector { 

    void inject(MainActivity activity); 

    void inject(AnotherActivity activity); 
} 

E qui è il componente con scope:

package com.svenjacobs.dagger2; 

import javax.inject.Singleton; 

import dagger.Component; 

/** 
* Application-wide dependencies. 
* 
* @author Sven Jacobs 
*/ 
@Singleton 
@Component(modules = ApplicationModule.class) 
interface ApplicationComponent { 

void inject(Dagger2Application application); 

/** 
* Provides dependency for sub-components 
*/ 
SomeApplicationDependency someApplicationDependency(); 
    } 

risposta

13

È necessario fornire un ambito per ApplicationComponent. Questo non deve essere necessariamente @Singleton, poiché Dagger 2 consente di definire i propri ambiti utilizzando l'annotazione @Qualifier su un'interfaccia.

@Scope 
public @interface CustomScopeName { 
} 

È quindi possibile utilizzare in questo modo:

@CustomScopeName 
@Component(dependencies = ApplicationComponent.class, 
    modules = { 
      MainActivityModule.class, 
      AModule.class, 
      BModule.class 
    }) ....... 

Penso che il motivo non ti è permesso di utilizzare una dipendenza ambito in un componente senza ambito è quello di evitare che Singletons dalla seconda non Singleton oggetti e prevenire le dipendenze cicliche.

2

Durante lo sviluppo di Dagger 2.0 il comportamento è stato modificato e l'ambito dei componenti è diventato più rigido. Vedi this discussion. Perché i miei progetti di esempio si basano sulla versione SNAPSHOT di Dagger 2.0 si è rotto.

Come detto da atamakosi e che è anche spiegato here abbastanza bene è necessario aggiungere un ambito personalizzato allo ActivityComponent, ad esempio @PerActivity.