Кинжал объявляет субкомпонент в модуле в моем случае - PullRequest
1 голос
/ 23 октября 2019

Я использую Dagger версии 2.24

Об объявлении этого модуля с подкомпонентом:

@Module(subcomponents = MySubComponent.class)
abstract class MyModule {
  ...
}

Я понимаю (если я уже неправильно понял, пожалуйста, укажите), этот код означает, что классыпод MyModule принадлежит MySubComponent.

В некоторых руководствах говорится,

этот код может заставить Dagger автоматически определять, запрашивается ли субкомпонент.

Что это значит? Означает ли это, что во время компиляции Dagger может решить, будет ли этот подкомпонент запрашиваться путем сканирования кодовой базы, чтобы увидеть, зависят ли какие-либо объекты в этом модуле от какого-либо кода, если нет, то не будет генерироваться MySubComponent (и он содержит объекты) при компиляциивремя? В противном случае Dagger будет генерировать MySubComponent (и объекты принадлежат ему)?

Правильно ли я понимаю или я что-то упускаю?

1 Ответ

0 голосов
/ 27 октября 2019

Означает ли это, что во время компиляции Dagger может решить, запрашивать ли этот субкомпонент путем сканирования кодовой базы, чтобы увидеть, зависит ли какой-либо объект в этом модуле от какого-либо кода, если нет, то не будет MySubComponent (и он содержитобъекты) генерироваться во время компиляции? В противном случае Dagger будет генерировать MySubComponent (и объекты принадлежат ему)?

Я думаю, что вы перепутали code generation и object instantiated. Код генерируется всегда (т. Е. MySubComponent всегда генерируется Dagger), но погода на нем instantiated основана на том, необходим ли он для объекта, созданного MyModule.

If MyModule предоставляет объект, который требуется для строителя MySubComponent, только когда этот объект создан, тогда строителем MySubComponent будет instantiated, как показано в примере из https://dagger.dev/subcomponents.html

@Singleton
class RequestRouter {
  @Inject RequestRouter(
      Provider<RequestComponent.Builder> requestComponentProvider) {}

  void dataReceived(Data data) {
    RequestComponent requestComponent =
        requestComponentProvider.get()
            .data(data)
            .build();
    requestComponent.requestHandler()
        .writeResponse(200, "hello, world");
  }
}

При создании RequestRouter дается Provider<RequestComponent.Builder> requestComponentProvider. И только после вызова функции dataReceived создается Субкомпонентный конструктор (т. Е. RequestComponent), который затем создает Субкомпонент (т. Е. RequestComponent).

При наличии @Module(subcomponents = MySubComponent.class) allowотложенное создание его подкомпонента, следовательно, он заявляет следующее

этот код может заставить Dagger автоматически обнаруживать, запрашивается ли подкомпонент.

Вышеприведенное утверждение предназначено для этой целиконтрастирования с другим подходом instantiating MySubComponent, как указано ниже

Другой подход заключается в том, чтобы заставить подкомпонент (или его построитель) всегда быть instantiated независимо от этого, создав его через ParentComponent.

@Component
interface MyParentComponent {
    MySubComponent getSubComponent();
}

Вы можете обратиться к статье https://medium.com/@elye.project/dagger-2-subcomponent-through-module-or-component-comparison-92486767a861 для более подробной информации между ними.

Надеюсь, это прояснится.

...