2017-09-30 2 views
0

Je suis nouveau à Dagger et l'apprentissage de l'implémentation de Dagger 2.11 dans une application android. J'ai suivi quelques tutoriels et créé un exemple de projet. Mais je reçois cette erreur:Dagger 2.11 [dagger.android.AndroidInjector.inject (T)] Trouvé un cycle de dépendance

Error:(19, 8) error: [dagger.android.AndroidInjector.inject(T)] Found a dependency cycle: 
com.saharan.daggerart.DaggerArtApplication is injected at 
com.saharan.daggerart.AppModule.provideApplicationContext(application) 
com.saharan.daggerart.DaggerArtApplication is injected at 
com.saharan.daggerart.AppModule.provideSharedPreferences(application) 
android.content.SharedPreferences is injected at 
com.saharan.daggerart.MainActivity.preferences 
com.saharan.daggerart.MainActivity is injected at 
dagger.android.AndroidInjector.inject(arg0) 

AppComponent:

@Singleton 
@Component(modules = {AndroidInjectionModule.class, AppModule.class, ActivityModule.class}) 
public interface AppComponent { 
    @Component.Builder 
    interface Builder { 
     @BindsInstance 
     Builder application(Application application); 
     AppComponent build(); 
    } 
    void inject(DaggerArtApplication application); 
} 

AppModule:

@Singleton 
@Module(subcomponents = {MainActivityComponent.class}) 
public class AppModule { 

    @Provides 
    @Singleton 
    DaggerArtApplication provideApplicationContext(DaggerArtApplication application) { 
     return application; 
    } 

    @Provides 
    @Singleton 
    SharedPreferences provideSharedPreferences(DaggerArtApplication application) { 
     return application.getSharedPreferences(Constants.PrefKeys.PREF_NAME, Context.MODE_PRIVATE); 
    } 
} 

ActivityModule:

@Module 
public abstract class ActivityModule { 
    @Binds 
    @IntoMap 
    @ActivityKey(MainActivity.class) 
    abstract AndroidInjector.Factory<? extends Activity> bindMainActivity(MainActivityComponent.Builder builder); 
} 

MainActivityComponent:

@Subcomponent(modules = MainActivityModule.class) 
public interface MainActivityComponent extends AndroidInjector<MainActivity> { 
    @Subcomponent.Builder 
    abstract class Builder extends AndroidInjector.Builder<MainActivity> { 
    } 
} 

MainActivityModule:

@Module 
public class MainActivityModule { 

    @Provides 
    String provideUserName() { 
     return "Mr. Bond"; 
    } 
} 

Et maintenant MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Inject String username; 
    @Inject 
    SharedPreferences preferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AndroidInjection.inject(this); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

Qu'est-ce que je fais mal? S'il vous plaît aider !!

Répondre

3

Cela ressemble à une faute de frappe.

DaggerArtApplication provideApplicationContext(DaggerArtApplication application) 

Cela signifie que Dague a besoin d'un DaggerArtApplication pour fournir une DaggerArtApplication. Je suppose que vous vouliez dire

DaggerArtApplication provideApplicationContext(Application application) 

qui lierait DaggerArtApplication-Application.