Dagger 2.10의 Android를 확장해 보십시오.
간략한 개요
BaseActivity
나 BaseFragment
를 쓰지 않아도 된다개시하다
Dagger는 스퀘어가 개발한 DI 라이브러리이며, Dagger 2는 구글 포크 버전이다.정식 Dagger는 Deprecated이며 Dagger2로의 마이그레이션 마법사가 Google에서 공개되었습니다.DridKaigi 회의 응용 프로그램에서도 Dagger2를 사용했고 세션에서도 Dagger2와 관련된 내용이 있어 안드로이드 앱 개발 현장에서 자주 사용된다.
이런 Dagger2, Dagger2.10RC는 안드로이드용 확장 모듈을 공개했다.비록 Dagger2의 GiitHub Pages에는 확장 모듈을 사용하는 안드로이드 사용법이 적혀 있습니다.의것이지만, 나는 여전히 충분하지 않고 이해하기 어렵다고 생각한다.
이번에는 이 안드로이드용 확장 모듈을 사용해 보고 싶습니다.
차리다
build.gradle
먼저
app/build.gradle
에 Dagger 2의 의존 관계를 씁니다.ext {
dagger_version = '2.10-rc4'
}
dependencies {
compile "com.google.dagger:dagger:${dagger_version}"
compile "com.google.dagger:dagger-android:${dagger_version}"
compile "com.google.dagger:dagger-android-support:${dagger_version}"
annotationProcessor "com.google.dagger:dagger-compiler:${dagger_version}"
annotationProcessor "com.google.dagger:dagger-android-processor:${dagger_version}"
}
dagger-android
dagger-android-support
dagger-android-processor
dagger-android-support
는 필요합니다(대부분의 경우 필요하다고 생각합니다).App.java
그런 다음 Application 레벨을 상속하는 사용자 정의 Application 레벨을 준비합니다.여기에 앱이라는 이름을 쓴다.사용자 정의 Application 클래스에는 Dagger의 Android 확장 모듈에 준비된 Ha s D i spatchingActivity Injector가 설치되어 있습니다.액티비티에 대한 의존을 주입하는 데 필요한 것이지만, 안드로이드 서포트 리브레리에 대한 Fragment 의존을 주입하려면 Ha s D i s p a t c h i ngSupport Fragment Injector도 함께 실행해야 한다.
여기에는 Has D i spatching Activity Injector만 구현됩니다.
public class App extends Application implements HasDispatchingActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> mActivityInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent.create().inject(this);
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return mActivityInjector;
}
}
App#onCreate
내 호출DaggerAppComponent.create().inject(this);
이 진행 중입니다. 이것은 잠시 후 준비된 AppComponent의 설치입니다.Dagger 2를 컴파일할 때 코드를 생성합니다.호출 대상 방법을 통해@Inject
모조된mActivityInjector
에 주입DispatchingAndroidInjector<Activity>
실례.AppCompnent.java
AppComponent.자바 준비해.아까 앱.자바에 D ispatching Android Injector를 주입해야 하기 때문에 해결할 수 있도록 실시합니다.
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
MainActivityModule.class
})
public interface AppComponent {
void inject(App app);
}
준비AppComponent#inject(App)
를 통해 App.자바에 의존을 주입할 수 있습니다.또 Dagger2의 안드로이드를 확장 모듈에 준비된 안드로이드 Injection Module로 @Component
가이드modules
에 전달한다.또 잠시 후 준비된 MainActivity Module도 전달해 드리겠습니다.MainActivityModule.java
MainActivityModule.자바 준비해.이 모듈은 Dagger2의 Android Injector가MainActivity에 의존성을 주입할 수 있도록 합니다.
@Module(subcomponents = {MainActivityComponent.class})
public abstract class MainActivityModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindMainActivityInjectorFactory(MainActivityComponent.Builder builder);
}
이 일대에서 나는 아직 역할과 행위를 이해할 수 없다.등장인물은 더 늘어난다.MainActivity Component 준비MainActivityComponent.java
MainActivityComponent.자바 준비해.이 구성 요소는 MainActivity에 대한 의존도를 보여 줍니다.
@Subcomponent(modules = ActivityModule.class)
public interface MainActivityComponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
public abstract void activityModule(ActivityModule activityModule);
@Override
public void seedInstance(MainActivity instance) {
activityModule(new ActivityModule(instance));
}
}
}
Android Injector 인터페이스를 상속합니다.유형 매개 변수는 종속 주입 대상MainActivity에 의해 전달됩니다.어떤 의존관계@Subcomponent
가 모조품modules
에 쓰여 있습니까?여기서 Activity Module을 건네주세요.또한MainActivity Component에서 이 구성 요소의 구축 클래스는
abstract
로 정의됩니다.@Subcomponent.Builder
구축 클래스에 초대장을 추가합니다.또한 Android Injector도 있습니다.또한 Builder 클래스를 상속하여 형 매개변수에 MainActivity를 전달합니다.액티비티 모듈을 매개 변수
activityModule
로 하는 추상적인 방법을 준비했다. ActivityInjector.Builder#seedInstance
내에서액티비티 모듈을 액티비티에 넘기기 위한 실례다.seedInstance
방법의 실현과 activityModule
에 필요한 요소의 교부 실례를 정의한다.ActivityModule.java
ActivityModule.자바 준비해.이 모듈은 MainActivity를 주입하려는 의존 실체를 기록합니다.
@Module
public class ActivityModule {
private final AppCompatActivity mActivity;
public ActivityModule(AppCompatActivity activity) {
mActivity = activity;
}
@Provides
public LayoutInflater provideLayoutInflater() {
return LayoutInflater.from(mActivity);
}
}
LayoutInflater를 주입해 보세요.공장 방법LayoutInflater#from
으로는 컨텍스트를 제출해야 하지만 응용 프로그램을 해결하는 Theme에는Activity 컨텍스트가 필요하다.따라서 Activity의 실례가 필요하지만, 이것은MainActivityComponent입니다.자바에서 전달하는 것으로 정의되었습니다.MainActivity.java
드디어 의존의 주입 목적지인 MainActivity에 도달했다.
public class MainActivity extends AppCompatActivity {
@Inject
LayoutInflater mLayoutInflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (mLayoutInflater != null) {
new AlertDialog.Builder(this)
.setMessage("Hello, world")
.setPositiveButton(android.R.string.ok, null)
.show();
}
}
}
여기 새 것은 AndroidInjection.inject(this);
입니다.따라서 실례는 @Inject
에 초청된 실례LayoutInflater mLayoutInflater;
에 주입되었다.코드에 null이 아닌 경우 LayoutInflater가 주입된 경우 경고 대화 상자가 표시되고 종속성이 해결된 경우 경고 대화 상자가 표시됩니다.다시 App입니다.java
모든 준비가 다 되었으면 구축해 보겠습니다.App.자바에서 Dagger2가 생성한 Dagger App Component를 해결해야 하기 때문에 구축에 성공하면 App이 됩니다.자바를 열면 가져오는 것을 촉진합니다.
가져오기가 완료되었습니다.
최후
Dagger 2.10의 Android용 확장 모듈을 시도했습니다.솔직히 이해가 안 되는 부분이 많아서 이런 형식이 정말 좋은지 말할 자신이 없어요.그리고 의존 주입 목적지가 1개씩 늘어날 때마다 대응하는 모듈/Component를 준비해야 하는데, 앱Component
@Component
의 초대장에 모듈을 열거해야 한다고 생각하면 귀찮아진다.그러나 우리는 모든 주입 목표에 따라 의존 관계를 정의할 수 있고 규정된 규칙에 따라 관리할 수 있는 장점도 있기 때문에 필요에 따라 확장 모듈을 사용하고 싶습니다.
Reference
이 문제에 관하여(Dagger 2.10의 Android를 확장해 보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryugoo/items/c58fb413882f482f7642텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)