2016-11-16 2 views
0

у меня есть:Два @Injects в одном объекте, но из двух различных компонентов

@Inject 
AdalService adalService; 

@Inject 
Realm realm; 

Оба они происходят из двух разных компонентов.

AdalComponent

@UserScope 
@Component(dependencies = {NetComponent.class}, modules = AdalServiceModule.class) 
public interface AdalServiceComponent 
{ 
    void inject(MainActivity activity); 

    void inject(EventsJob eventsJob); 
} 

RealmComponent

@UserScope 
@Subcomponent(modules = RealmModule.class) 
public interface RealmComponent 
{ 
    void inject(EventsJob eventsJob); 
} 

Но я получаю следующее сообщение об ошибке:

Error:(16, 10) error: io.realm.Realm cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
    io.realm.Realm is injected at 
    com.bjss.bjssevents.jobs.EventsJob.realm 
    com.bjss.bjssevents.jobs.EventsJob is injected at 
    com.bjss.bjssevents.dagger.components.AdalServiceComponent.inject(eventsJob) 

RealmModule

@Module 
public class RealmModule 
{ 
    private static final String TAG = RealmModule.class.getSimpleName(); 

    public RealmModule(@Singleton final Context context) 
    { 
     Log.d(TAG, "Configuring Realm"); 
     Realm.init(context); 
     Realm.setDefaultConfiguration(new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().build()); 
    } 

    @UserScope 
    @Provides 
    public Realm providesRealm() 
    { 
     Log.d(TAG, "Providing Realm"); 
     return Realm.getDefaultInstance(); 
    } 
} 
+0

проблемные темы не показаны. Это должно быть в методе, который '@ предоставляет'' Realm' –

+0

Где ваш '@ Module' для предоставления экземпляра Realm? Можете ли вы вставить этот код. – raxelsson

+0

Добавлен RealmModule. – Subby

ответ

2

Внутри AdalServiceComponent и RealmComponent у вас есть один и тот же метод:

void inject(EventsJob eventsJob); 

Это неприемлемо. Должен быть только один метод inject для указанного объекта (аргумент метода inject).

Также вы не можете вводить предметы с двух моделей на том же уровне. Оба значения Component аннотируются с той же областью: @UserScope. Они ничего не знают друг о друге. Если вы хотите определить ресурсы в AdalServiceComponent и RealmComponent, сделайте один из них родителем Component, а другой Subcomponent. И метод inject должен быть в подкомпоненте.

Прочитайте this excellent article series о продвинутом поведении Кинжала-2, чтобы лучше понять эту библиотеку.

+0

+1, так как это имеет смысл. С тех пор я исправил проблему, имея только один компонент и добавляя к нему ВСЕ модули. – Subby

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