Slide 1

Slide 1 text

REPLACE WITH DAGGER.ANDROID

Slide 2

Slide 2 text

HELLO ABOUT ME Yuji Koketsu @kettsun0123 ▸ Android Developer ▸ CyberAgent, Inc ▸ ݩ AbemaTV >> ৽نϝσΟΞ

Slide 3

Slide 3 text

REPLACE WITH DAGGER.ANDROID What is dagger.android?

Slide 4

Slide 4 text

WHAT IS DAGGER.ANDROID? DAGGER.ANDROID IS… ▸ Dagger2ͷAndroid֦ுDIϥΠϒϥϦ ▸ v2.10 ▸ core͕ϦϦʔε ▸ v2.11 ▸ @ContributesAndroidInjector௥Ճ ▸ DaggerApplication௥Ճ ▸ v2.12 ▸ ࠓ࠷৽൛ʂ https://github.com/google/dagger/releases

Slide 5

Slide 5 text

WHAT IS DAGGER.ANDROID? class MainActivity : AppCompatActivity() { lateinit var instance: Hoge override fun onCreate(state: Bundle?) { super.onCreate(state) ... } ... }

Slide 6

Slide 6 text

WHAT IS DAGGER.ANDROID? class MainActivity : AppCompatActivity() { @Inject lateinit var instance: Hoge override fun onCreate(state: Bundle?) { AndroidInjection.inject(this) super.onCreate(state) ... } ... }

Slide 7

Slide 7 text

REPLACE WITH DAGGER.ANDROID dagger.androidͰஔ͖׵͑Δ

Slide 8

Slide 8 text

REPLACE WITH DAGGER.ANDROID App MainActivity AppModule class Hoge

Slide 9

Slide 9 text

REPLACE WITH DAGGER.ANDROID dependencies { // dagger.android implementation "com.google.dagger:dagger-android:2.12" implementation "com.google.dagger:dagger-android-support:2.12" kapt "com.google.dagger:dagger-android-processor:2.12" }

Slide 10

Slide 10 text

REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AppModule::class )) interface AppComponent { fun inject(app: App) fun activityComponent(): ActivityComponent }

Slide 11

Slide 11 text

REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, AppModule::class )) interface AppComponent : AndroidInjector { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }

Slide 12

Slide 12 text

REPLACE WITH DAGGER.ANDROID ActivityComponent.kt @Subcomponent(modules = arrayOf( ... )) interface ActivityComponent { fun inject(activity: MainActivity) }

Slide 13

Slide 13 text

REPLACE WITH DAGGER.ANDROID ActivityComponent.kt @Subcomponent(modules = arrayOf( ... )) interface ActivityComponent : AndroidInjector { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder() }

Slide 14

Slide 14 text

REPLACE WITH DAGGER.ANDROID ActivityModule.kt @Module(subcomponents = ActivityComponent::class) internal abstract class ActivityModule { @Binds @IntoMap @ActivityKey(MainActivity::class) internal abstract fun bindMainInjector( builder: ActivityComponent.Builder ): AndroidInjector.Factory } SubcomponentΛModuleͰbind͢Δ

Slide 15

Slide 15 text

REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, AppModule::class )) interface AppComponent : AndroidInjector { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }

Slide 16

Slide 16 text

REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, ActivityModule::class, AppModule::class )) interface AppComponent : AndroidInjector { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }

Slide 17

Slide 17 text

REPLACE WITH DAGGER.ANDROID class App : Application() { val appComponent : AppComponent by lazy { DaggerAppComponent.builder() .appModule(AppModule(this)) .build() } override fun onCreate() { super.onCreate() ... } ... } App.kt

Slide 18

Slide 18 text

REPLACE WITH DAGGER.ANDROID App.kt class App : DaggerApplication() { override fun applicationInjector() = DaggerAppComponent.builder() .application(this) .build() override fun onCreate() { super.onCreate() ... } ... }

Slide 19

Slide 19 text

REPLACE WITH DAGGER.ANDROID MainActivity.kt class MainActivity : AppCompatActivity() { @Inject lateinit var instance: Hoge override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) application.appComponent.activityComponent.inject(this) ... } ... }

Slide 20

Slide 20 text

REPLACE WITH DAGGER.ANDROID MainActivity.kt class MainActivity : AppCompatActivity() { @Inject lateinit var instance: Hoge override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) ... } ... }

Slide 21

Slide 21 text

MORE SIMPLE ΋ͬͱγϯϓϧʹॻ͚·͢

Slide 22

Slide 22 text

MORE SIMPLE @ContributesAndroidInjector Dagger v2.11 ~

Slide 23

Slide 23 text

MORE SIMPLE ActivityComponent.kt @Subcomponent(modules = ...) interface ActivityComponent : AndroidInjector { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder() }

Slide 24

Slide 24 text

MORE SIMPLE ActivityComponent.kt @Subcomponent(modules = ...) interface ActivityComponent : AndroidInjector { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder() } Component࡞Βͳͯ͘ྑ͍

Slide 25

Slide 25 text

MORE SIMPLE ActivityModule.kt @Module(subcomponents = ActivityComponent::class) internal abstract class ActivityModule { @Binds @IntoMap @ActivityKey(MainActivity::class) internal abstract fun bindMainInjector( builder: ActivityComponent.Builder ): AndroidInjector.Factory }

Slide 26

Slide 26 text

MORE SIMPLE ActivityModule.kt @Module(subcomponents = ActivityComponent::class) internal abstract class ActivityModule { @Binds @IntoMap @ActivityKey(MainActivity::class) internal abstract fun bindMainInjector( builder: ActivityComponent.Builder ): AndroidInjector.Factory } Subcomponentͷbind΋ॻ͔ͳ͍͍ͯ͘

Slide 27

Slide 27 text

MORE SIMPLE ActivityBuilder.kt @Module internal abstract class ActivityBuilder { @ContributesAndroidInjector(modules = arrayOf(...)) internal abstract fun contributeMainActivityInjector(): MainActivity } ͜Ε͚ͩͰSubcomponent͕Ͱ͖Δ

Slide 28

Slide 28 text

MORE SIMPLE @ContributesAndroidInjectorͰγϯϓϧʹ

Slide 29

Slide 29 text

FIN Thanks:)