2016-09-26 5 views
7

У меня здесь странная проблема, и я не совсем понимаю, почему то, что я делаю, не допускается. У меня есть следующие модули:Dagger 2 Singleton Component Depend On Singleton

@Module 
public final class AppModule { 
    private Context mContext; 

    @Provides 
    @Singleton 
    @AppContext 
    public Context provideContext() { return mContext; } 
} 

@Module 
public final class NetModule { 
    @Provides 
    @Singleton 
    public OkHttpClient provideOkHttp() { 
    return new OkHttpClient.Builder().build(); 
    } 
} 

По разным причинам я не хочу, чтобы эти два модуля в одном компоненте (в основном из-за мою структуру проекта). Так что я попытался создать следующие компоненты:

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 
    @AppContext Context appContext(); 
} 

@Singleton 
@Component(dependencies = AppComponent.class, modules = NetModule.class) 
public interface NetComponent { 
    Retrofit retrofit(); 
} 

Но когда я пытаюсь скомпилировать это, я получаю следующее сообщение об ошибке:

Error:(12, 1) error: This @Singleton component cannot depend on scoped components: @Singleton com.myapp.service.dagger.AppComponent

Я понимаю, почему в зависимости от различных областей будет быть плохим и запрещенным. Но почему Синглтон зависит от Singleton? Это похоже на то, что он должен работать, поскольку все, что я делаю, - это декларирование родственных компонентов. Что мне не хватает?

ответ

12

Поскольку ваш компонент NetComponent зависит от вашего компонента AppComponent, они не могут иметь одинаковую область действия. Области используются для аннотирования жизненных циклов, и поскольку NetComponent зависит от AppComponent, они не имеют одного и того же жизненного цикла. AppComponent может жить дольше, чем NetComponent, потому что это часть процесса сборки NetComponent. NetComponent не может существовать без AppComponent, но не наоборот.

Вы можете добавить свою собственную область видимости и применить ее к NetComponent и NetModule, которые исправят ее.

+1

Хм, я вижу - это имеет смысл. Но просто для того, чтобы задать здесь очевидный следующий вопрос, я полагаю, что это ограничение будет применяться ко всем дополнительным пользовательским областям, верно? Если я создал область «ПерАппликация», я мог бы применить ее к NetComponent/Module и быть в порядке. Но если бы я хотел создать другой компонент, зависящий от NetComponent, мне понадобится еще одна область (потому что жизненный цикл снова может быть немного другим). Это верно? – tmtrademark

+0

Да, это правильно. – ootinii

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