2017-08-27 4 views
0

Ich versuche, das folgende Verhalten zu erreichen:Module mit gemischten Bereichen

  • ein Objekt von einem Modul unter einem Singleton Umfang in einem anderen Modul mit einem anderen Bereich vorgesehen verwenden.

Hier ist was ich habe. Ich habe viele Änderungen auf der Grundlage mehrerer Antworten versucht, aber ich kann dieses Problem immer noch nicht lösen.

Das erste Modul (sollte der Lebenszyklus der Anwendung gebunden werden)

@Module 
public class AModule { 

private Context context; 

public AModule(Context context) { 
    this.context = context; 
}  

@Provides 
@Singleton 
MySharedPreference provideMySharedPreference(SharedPreferences prefs) { 
    return new MySharedPreferences(prefs); 
} 

@Provides 
@Singleton 
SharedPreference provideSharedPreference() { 
    return context.getSharedPreferences("prefs", 0); 
} 

Es ist Bestandteil

@Component(modules = AModule.class) 
@Singleton 
public interface AComponent { 
    void inject(...); 
} 

Das zweite Modul (begrenzt auf Activity Lifecycle)

@Module 
public class BModule { 

    @Provides 
    @ActivityScope 
    X provideX(MySharedPreferences prefs) { 
     return new Y(prefs); 
    } 
} 

Es ist Komponente

@Component(modules = BModule.class) 
@ActivityScope 
public interface BComponent { 
    Y Y(); 
} 

ich die Aktivität Scope erklärt

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

Und MySharedPreferences als

public class MySharedPreferences { 

    private SharedPreferences mSharedPrefs; 

    @Inject 
    public MySharedPreferences(SharedPreferences prefs) { 
     mSharedPrefs = prefs; 
    } 

    // some methods 
} 

schließlich in meiner Anwendungsklasse folgt, ist, ich die A-Komponente

aComponent = DaggerAComponent.builder().aModule(new AModule(getApplicationContext())).build(); 

EDIT erstellen Einige der Dinge, die ich ausprobiert

Ich habe versucht, includes = AModule.class zum BModule hinzuzufügen. Ich habe versucht, dependencies = AComponent.class der BComponent hinzuzufügen. Ich habe versucht, eine neue Komponente mit der ActivityScope Annotation zu erstellen.

Antwort

1

Wenn Sie abhängige Komponenten verwenden (dependencies =), müssen Sie eine Bereitstellungsmethode erstellen, um die Abhängigkeit von der @Singleton-Bereichskomponente der @ActivityScope-Komponente anzuzeigen.

@Component(modules = AModule.class) 
@Singleton 
public interface AComponent { 
    void inject(...); 

    SharedPreferences exposeSharedPreferences(); 
} 

Die Bereitstellung Methode wird die abhängige @ActivityScope Komponente erlauben @Singleton für SharedPreferences Bindung zu verwenden:

@Component(modules = BModule.class, dependencies = AComponent.class) 
@ActivityScope 
public interface BComponent { 
    Y Y(); 
} 

Siehe this question für eine detailliertere Erläuterung der Bestimmung Methoden.

+0

Danke für Ihre Antwort! Jetzt verstehe ich. Ich hatte tatsächlich etwas Ähnliches versucht, um das Problem zu lösen, aber jetzt ist es viel klarer. –