两个@Injects在一个对象中但来自两个不同的组件

时间:2016-11-16 12:39:05

标签: android dagger-2

我有:

@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();
    }
}

1 个答案:

答案 0 :(得分:2)

AdalServiceComponentRealmComponent内,你有相同的方法:

void inject(EventsJob eventsJob);

这是不可接受的。对于指定对象(inject方法的参数),必须只有一个inject方法。

此外,您无法从同一级别的两个模块中注入东西。 Component&#39}都使用相同的范围进行注释:@UserScope。他们对彼此一无所知。如果您要在AdalServiceComponentRealmComponent中定义资源,请将其中一个设为父Component,另一个设为Subcomponentinject方法应该在子组件中。

请阅读this excellent article series有关高级Dagger-2行为的信息,以便更好地了解此库。