2016-04-04 10 views
1

Ich habe eine Aktivität mit 2 Injektionen. Jede injizierte Komponente arbeitet allein, sondern die Injektion sowohl führt zu folgenden Fehler:Dolch 2 multiple Injektion auf Android

Error:(12, 10) error: android.app.Fragment cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
fr.daggertest.MainActivity.fragmentB 
[injected field of type: android.app.Fragment fragmentB] 

Error:(12, 10) error: android.app.Application cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
fr.daggertest.MainActivity.applicationA 
[injected field of type: android.app.Application applicationA] 

Aber sie sind beide schon @Provides kommentiert, so sehe ich nicht, was falsch ist?

MainActivity.java

public class MainActivity extends AppCompatActivity { 

@Inject 
Fragment fragmentB; 

@Inject 
Application applicationA; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // create component & inject... 
} 

Module & Komponenten:

@Component(modules={ModuleA.class}) 
@Singleton 
public interface ComponentA { 
    void inject(MainActivity activity); 
} 

@Component(modules={ModuleB.class}) 
@Singleton 
public interface ComponentB { 
    void inject(MainActivity activity); 
} 

@Module 
public class ModuleA { 
    Application mApplication; 

    public ModuleA(Application application) { 
     mApplication = application; 
    } 

    @Provides 
    public Application provideApplication() { 
     return mApplication; 
    } 
} 

@Module 
public class ModuleB { 
    Fragment mFragment; 

    public ModuleB(Fragment fragment) { 
     mFragment = fragment; 
    } 

    @Provides 
    public Fragment provideFragment() { 
     return mFragment; 
    } 
} 
+0

Sie haben keine Methode angegeben, die "Aktivität", nur "Fragment" und "Anwendung" bereitstellt. Könnten Sie auch Ihren Code "create component & inject" posten? – Pelocho

+0

Sorry, es war ein Tippfehler, ich habe den Code bearbeitet. Der Code "create component & inject" ist auskommentiert, das ist nicht die Ursache des Kompilierungsfehlers. –

+0

Eigentlich könnte es. Überprüfen Sie meine Antwort – Pelocho

Antwort

1

Wenn Sie versuchen, eine Activity mit einem Component Dagger 2 zu injizieren, prüft, ob Component jede Abhängigkeit mit @Inject kommentierten zur Verfügung stellen kann

Im Moment ist Ihr Components (wahrscheinlich y) liefert nur eine von zwei Abhängigkeiten. Machen Sie eine Komponente hängen von der anderen ein oder machen eine von ihnen nehmen beide Modules

Eine andere mögliche Lösung, um Ihre Component s dies ändern könnte:

@Singleton 
public interface ComponentA { 
    Application getApplication(); 
} 

@Component(modules={ModuleB.class}) 
@Singleton 
public interface ComponentB { 
    Fragment getFragment(); 
} 

und ändern Sie Ihre Injektion Code dazu:

ComponentA componentA = ... 
ComponentB componentB = ... 
applicationA = componentA.getApplication(); 
fragmentB = componentB.getFragment(); 
+0

Ich kann nicht eine Abhängigkeit von der anderen machen, weil sie beide bereits von einer anderen Komponente mit unterschiedlichem Umfang abhängt (im Beispiel zur Vereinfachung nicht gezeigt). Machen Sie eine von ihnen beide Modul scheint falsch, da sie völlig unabhängig sind. –

+0

In diesem Fall müssen Sie wahrscheinlich Ihre Felder "manuell" injizieren. Überprüfen Sie meine Bearbeitung – Pelocho

Verwandte Themen