Android 示例
使用 Dagger 編寫 Android 應用程式的一個主要困難是許多 Android 框架類都由作業系統本身例項化,如 Activity 和 Fragment,但如果 Dagger 可以建立所有注入的物件,則效果最佳。相反,你必須在生命週期方法中執行成員注入。從版本 2.10 開始,dagger 允許使用 dagger.android,這簡化了使用 Android 元件的匕首。
注入 Activity 物件
-
在應用程式元件中安裝
AndroidInjectionModule,以確保這些基本型別所需的所有繫結都可用。@Component(modules = {AndroidInjectionModule.class}) public interface AppComponent {} -
首先編寫一個實現[AndroidInjector] [AndroidInjector]的
@Subcomponent,其中包含擴充套件[AndroidInjector.Builder] [AndroidInjector.Builder]的@Subcomponent.Builder:@Subcomponent public interface MainActivityComponent extends AndroidInjector<MainActivity> { @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<MainActivity> {} } -
定義子元件後,通過定義繫結子元件構建器的模組並將其新增到注入
Application的元件,將其新增到元件層次結構中:@Module(subcomponents = MainActivityComponent.class) public abstract class MainActivityModule { @Binds @IntoMap @ActivityKey(MainActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindMainActivityInjectorFactory(MainActivityComponent.Builder builder); } -
接下來,讓你的
Application實現HasDispatchingActivityInjector和@Inject一個DispatchingAndroidInjector<Activity>從activityInjector()方法返回:public class MyApp extends Application implements HasDispatchingActivityInjector { @Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector; @Override public void onCreate() { super.onCreate(); DaggerAppComponent.create().inject(this); } @Override public DispatchingAndroidInjector<Activity> activityInjector() { return dispatchingActivityInjector; } } -
最後,在你的
Activity.onCreate()方法中,在呼叫super.onCreate();之前呼叫AndroidInjection.inject(this):public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); } }