Привет, сообщество. У меня проблема с пониманием того, как кинжал 2 добавляет субкомпонент новым способом (добавлен в кинжал 2.7). Смотрите пример ниже:
@Component(modules = {AppModule.class, MainActivityBinder.class})
@Singleton
interface AppComponent
{
inject(MyApplication _)
}
@Subcomponent(modules = ActivityModule.class)
interface ActivitySubcomponent
{
inject(MainActivity _)
@Subcomponent.Builder
interface Builder
{
@BindInstance
Builder activity(Activity activity)
ActivitySubcomponent build();
}
}
Начальный шаг: у меня AppComponent
с является моим корневым компонентом, который обеспечивает AppModule
синглетами (модернизация, охтп и т. Д.). В ActivitySubcomponent
я предоставляю ActivityModule
с зависимостями, указанными для этого действия. Теперь подкомпонент должен быть добавлен к AppComponent
, поэтому по-новому я создаю указанный модуль с именем MainActivityBinder
, который имеет аннотации @ Module.subcomponents с точкой, которая связывает подкомпонент, но у меня есть первая проблема, что должно быть в теле этого модуль связывания?
@Module(subcomponents = ActivitySubcomponent.class)
public class MainActivityBinder
{
//what body of this class should be ??
}
Я знаю, что идея заключается в том, что я могу связывать субкомпонент или его конструктор. Второй вопрос, когда связывать строителя, а когда связывать подкомпонент? Например, мой ActivitySubcomponent
требуемый контекст активности, поэтому я создаю конструктор, который предоставляет контекст для ActivityModule
, в этом случае будет лучше предоставить в MainActivityBinder
конструктор? Третий вопрос, как вызвать компоновщик компонентов и как получить подкомпонент для компонента приложения? В стандартной фабрике подкомпонентов я добавил к AppComponent
метод, который возвращает подкомпонент, и я могу определить параметры (например, дать контекст действия, указанный ниже)
@Component(modules = {AppModule.class})
@Singleton
interface AppComponent
{
ActivitySubcomponents newActivitySubcomponents(Activity activity);
inject(MyApplication _);
}
// in MainActivity
appComponent.newActivitySubcomponents(this).build().inject(this);
Итак, добились ли вы такого поведения в новом методе добавления подкомпонентов?