2016-04-04 6 views
1

Активность: Активность: 2 инъекции. Каждый впрыскивается компонент работает в одиночку, но и инъекционного приводит к следующим ошибкам:Dagger 2 multiple Injection на 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] 

Но они оба уже @Provides аннотированный, так что я не вижу, что это не так?

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... 
} 

Модули & компоненты:

@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

Вы не предоставили метод, который предоставляет 'Activity', только' Fragment' и 'Application'. Также вы можете опубликовать свой код «создать компонент и ввести»? – Pelocho

+0

Жаль, что это была опечатка, я редактировал код. Код «create component & inject» закомментирован, это не является причиной ошибки компиляции. –

+0

Собственно, это возможно. Проверьте мой ответ – Pelocho

ответ

1

Если вы пытаетесь внедрить в Activity с Component Dagger 2 будет проверять, что Component может обеспечить каждую зависимость аннотированный с @Inject

Прямо сейчас ваш Components (probabl y) предоставляет только одну из двух зависимостей. Сделайте один компонент зависит от другого или сделать один из них принимают как Modules

Другим возможным решением может быть изменить Component с до этого:

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

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

и изменить свой инъекционного код следующим образом:

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

Я не могу зависеть от другого, потому что они оба уже зависят от другого компонента с разной областью действия (для простоты не показано). Сделать один из них, взять оба модуля, кажется неправильным, поскольку они совершенно не связаны. –

+0

В этом случае вам, вероятно, придется вводить свои поля «вручную». Проверьте мое редактирование – Pelocho

Смежные вопросы