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를 사용하지 않는 경우 어떻게 구성 요소를 초기화합니까?
답변
더 이상 사용되지 않는 이유에 대한 설명을 읽어야합니다 . IntelliJ 또는 Android Studio와 같은 IDE를 사용하는 경우 방법을 선택하고 Windows에서 Control+ Q를 눌러 지원 중단 알림을 포함한 Javadoc을 읽을 수 있습니다.
Javadoc은 다음을 읽습니다.
@deprecated이 모듈이 선언되었지만 구성 요소에서 인스턴스가 사용되지 않습니다. 이 방법은 작동하지 않습니다. 자세한 내용은 https://google.github.io/dagger/unused-modules를 참조 하십시오 .
이 링크에서 다음을 볼 수 있습니다.
Dagger 프로세서가 컴포넌트를 생성 할 때 바인딩 요청을 제공하는 데 명시 적으로 필요한 모듈 및 컴포넌트 종속성의 인스턴스 만 필요합니다.
- 구성 요소에서 사용되는 모든 모듈의 메서드가 정적이면 Dagger는 해당 모듈의 인스턴스가 전혀 필요하지 않습니다. Dagger는 모듈없이 직접 정적 메서드를 호출 할 수 있습니다.
- 모듈이 구성 요소에 대한 바인딩을 제공하지 않는 경우 그래프를 구성하는 데 해당 모듈의 인스턴스가 필요하지 않습니다.
지원 중단을 무시해도된다고 말하는 것이 안전합니다. 사용하지 않는 메서드와 모듈을 알리기위한 것입니다. Application
하위 그래프의 어딘가에서 실제로 필요 / 사용하자마자 모듈이 필요하며 사용 중단 경고가 사라집니다.
답변
응용 프로그램에서 구성 요소 및 모듈을 사용하지 않기 때문에 더 이상 사용되지 않는 것으로 표시됩니다.
@Inject
SomeObjectFromModule mSomeObject
응용 프로그램에 종속성을 주입하지 않는 경우 구성 요소를 초기화 할 필요가 없으므로 단검은 적어도 하나의 용도를 찾습니다.
뷰를 삽입하려는 클래스에이 라인을 추가 한 다음 클린 빌드 및 프로젝트를 다시 빌드하면 지원 중단이 해결됩니다.
답변
의 나 때 오류를 보여주는 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();
}
답변
호스트와 동일한 문제가 있으며 생성 된 구성 요소 작성기 클래스에서 모든 사람이 더 이상 사용되지 않는 문제를 원하므로 시간을 절약하기 위해 두 가지를 확인해야합니다.
1 / 모듈에 대한 대거 구문을 수정하고, 구성 요소도 주입 위치를주의 깊게 확인하십시오.
2 / 주입하려는 위치에 주입 개체 (주석 및 해당 개체 주입)가 있어야합니다. 코드를 다시 컴파일하면 더 이상 문제가 발생하지 않습니다. 🙂
답변
void inject(AppCompactActivity activity);
컴포넌트 클래스에서 선언하면 모듈 메소드가 더 이상 사용되지 않습니다 . 다음 void inject(MainActivity activity);
과 같이 긴밀한 결합을 사용 하고 프로젝트를 다시 빌드 해야하는 대신 모듈 클래스에는 deprecate 메서드가 없습니다.