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.)