Dagger 2.2 컴포넌트 빌더 모듈 메소드가 더 이상 사용되지 않음


81

dagger 2.2를 사용하기 시작했고 컴포넌트 빌더의 모듈 메소드는 더 이상 사용되지 않습니다.

이것은 내 응용 프로그램 구성 요소입니다.

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(Application application);
}

그리고 애플리케이션 모듈 :

@Module
public class ApplicationModule {
    Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return application;
    }
}

생성 된 클래스는 다음과 같습니다.

@Generated(
  value = "dagger.internal.codegen.ComponentProcessor",
  comments = "https://google.github.io/dagger"
)
public final class DaggerApplicationComponent implements ApplicationComponent {
  private DaggerApplicationComponent(Builder builder) {
    assert builder != null;
  }

  public static Builder builder() {
    return new Builder();
  }

  public static ApplicationComponent create() {
    return builder().build();
  }

  @Override
  public void inject(Application application) {
    MembersInjectors.<Application>noOp().injectMembers(application);
  }

  public static final class Builder {
    private Builder() {}

    public ApplicationComponent build() {
      return new DaggerApplicationComponent(this);
    }

    /**
     * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules.
     */
    @Deprecated
    public Builder applicationModule(ApplicationModule applicationModule) {
      Preconditions.checkNotNull(applicationModule);
      return this;
    }
  }
}

ComponentBuilder를 사용하지 않는 경우 어떻게 구성 요소를 초기화합니까?

답변:


180

더 이상 사용되지 않는 이유에 대한 설명을 읽어야합니다 . IntelliJ 또는 Android Studio와 같은 IDE를 사용하는 경우 방법을 선택하고 Windows에서 Control+ Q를 눌러 지원 중단 알림을 포함한 Javadoc을 읽을 수 있습니다.

Javadoc은 다음을 읽습니다.

@deprecated이 모듈이 선언되었지만 구성 요소에서 인스턴스가 사용되지 않습니다. 이 방법은 작동하지 않습니다. 자세한 내용은 https://google.github.io/dagger/unused-modules를 참조 하십시오 .

이 링크에서 다음을 볼 수 있습니다.

Dagger 프로세서가 컴포넌트를 생성 할 때 바인딩 요청을 제공하는 데 명시 적으로 필요한 모듈 및 컴포넌트 종속성의 인스턴스 만 필요합니다.

  • 구성 요소에서 사용되는 모든 모듈의 메서드가 정적이면 Dagger는 해당 모듈의 인스턴스가 전혀 필요하지 않습니다. Dagger는 모듈없이 직접 정적 메서드를 호출 할 수 있습니다.
  • 모듈이 구성 요소에 대한 바인딩을 제공하지 않는 경우 그래프를 구성하는 데 해당 모듈의 인스턴스가 필요하지 않습니다.

지원 중단을 무시해도된다고 말하는 것이 안전합니다. 사용하지 않는 메서드와 모듈을 알리기위한 것입니다. Application하위 그래프의 어딘가에서 실제로 필요 / 사용하자마자 모듈이 필요하며 사용 중단 경고가 사라집니다.


73
답변을 스캔하고 command + Q를 누르면 Android Studio가 종료됩니다. 두뇌를 켜고 돌아와서 답을 다시 읽어보세요.
Bri6ko

4
그런데 Ctrl + J. Ctrl + Q는 트롤링 시도입니다.
StarWind0

4
@StarWind 아니오 조업이는 의도 입니다 ), 윈도우 바로 가기
데이비드 Medenjak

2
정말 이해가 안 돼요. 왜이 대답이 최고입니까?
Sever

2
@Sever 정확히, javadoc은 모든 것을 말합니다. 이는 중복 부품에 대한 정보 일 뿐이며 마지막에 언급했듯이 무시해도됩니다. 모듈을 사용하는 코드를 추가하면 사라집니다.
David Medenjak

49

응용 프로그램에서 구성 요소 및 모듈을 사용하지 않기 때문에 더 이상 사용되지 않는 것으로 표시됩니다.

@Inject
SomeObjectFromModule mSomeObject

응용 프로그램에 종속성을 주입하지 않는 경우 구성 요소를 초기화 할 필요가 없으므로 단검은 적어도 하나의 용도를 찾습니다.

뷰를 삽입하려는 클래스에이 라인을 추가 한 다음 클린 빌드 및 프로젝트를 다시 빌드하면 지원 중단이 해결됩니다.


5
받아 들여진 대답이어야합니다. 또한 주입 후 "프로젝트 재 구축"을 잊지 마십시오.
sokarcreative

4

의 나 때 오류를 보여주는 Module더없는 @Provides의해 제공 방법 또는 대상 Dagger응용 프로그램에 사용되지 않습니다.
더 이상 사용되지 않는 모듈을 제거하는 예

기준 치수

@Module
public class SecondActivityModule {
    @Provides
    Book provideBookTest() {
        return new Book();
    }
}

활동

public class SecondActivity extends AppCompatActivity {
    @Inject
    Book test;
    ...
}

또는 구성 요소

@Component(modules = SecondModule.class)
public interface SecondComponent {

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

호스트와 동일한 문제가 있으며 생성 된 구성 요소 작성기 클래스에서 모든 사람이 더 이상 사용되지 않는 문제를 원하므로 시간을 절약하기 위해 두 가지를 확인해야합니다.

1 / 모듈에 대한 대거 구문을 수정하고, 구성 요소도 주입 위치를주의 깊게 확인하십시오.

2 / 주입하려는 위치에 주입 개체 (주석 및 해당 개체 주입)가 있어야합니다. 코드를 다시 컴파일하면 더 이상 문제가 발생하지 않습니다. :)


1

void inject(AppCompactActivity activity);컴포넌트 클래스에서 선언하면 모듈 메소드가 더 이상 사용되지 않습니다 . 다음 void inject(MainActivity activity);과 같이 긴밀한 결합을 사용 하고 프로젝트를 다시 빌드 해야하는 대신 모듈 클래스에는 deprecate 메서드가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.