Как использовать подкомпонент dagger2?

Согласно официальным документам: https://google.github.io/dagger/subcomponents.html, я добавляю подкомпонент в @Module, например:

@Module(subcomponents = {MainActivityComponent.class})
public class ContextModule {

    private Context mContext;

    public ContextModule(Context context) {
        mContext = context;
    }

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

}

И объявите мой компонент и подкомпонент следующим образом:

@Component(modules = ContextModule.class)
public interface AppComponent {
    Context provideContext();

    MainActivityComponent getMainActivityComponent();
}

@Subcomponent(modules = {HardwareModule.class, SoftwareModule.class})
public interface MainActivityComponent {
    void injectMainActivity(MainActivity activity);
}

Но код не может быть успешно скомпилирован. Ошибка такова:

Error:(11, 1) : com.kilnn.dagger2.example.MainActivityComponent doesn't have a @Subcomponent.Builder, which is required when used with @Module.subcomponents

Я не знаю, как написать @Subcomponent.Builder, и если я удалю объявление подкомпонента в @Module, все будет в порядке. Поэтому я не знаю, как правильно использовать подкомпонент.


person Kilnn    schedule 10.06.2017    source источник


Ответы (1)


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

MainActivityComponent.class

@Subcomponent.Builder
interface Builder {
     MainActivityComponent build();
}

Для вашей текущей реализации и, поскольку у вас нет специальных зависимостей, вам действительно не нужен файл Subcomponent.

Примечание. В целях соблюдения соглашения я рекомендую вам переименовать ваш Subcomponent в MainActivitySubcomponent.

person Joaquim Ley    schedule 11.07.2017
comment
Хотя это было давно, я также знаю, как использовать, но все же должен поблагодарить ваш ответ. Переименовать в MainActivitySubcomponent — хорошая идея. - person Kilnn; 12.07.2017
comment
Ну, я не мог знать :). Я просто пытался помочь. - person Joaquim Ley; 12.07.2017
comment
Извините, что копаюсь в старом вопросе, но @Joaquim Ley, почему вы пишете, что › Для вашей текущей реализации и, поскольку у вас нет особых зависимостей, вам действительно не нужен подкомпонент. Я вижу, что MainActivityComponent переименован в MainActivitySubcomponent и имеет два модуля, которых нет у AppComponent. - person Heroes84; 28.06.2018