Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Replace with dagger.android
Search
Yuji Koketsu
October 25, 2017
Programming
0
2.3k
Replace with dagger.android
Yuji Koketsu
October 25, 2017
Tweet
Share
More Decks by Yuji Koketsu
See All by Yuji Koketsu
How to contribute android-gpuimage
kettsun0123
0
560
AutoSizingTextView
kettsun0123
0
210
Android Instant Apps or Progressive Web Apps
kettsun0123
1
430
Other Decks in Programming
See All in Programming
Deep Dive into ~/.claude/projects
hiragram
8
1.5k
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
470
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
110
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
260
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
320
XP, Testing and ninja testing
m_seki
3
200
AIコーディング道場勉強会#2 君(エンジニア)たちはどう生きるか
misakiotb
1
250
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
1
120
ニーリーにおけるプロダクトエンジニア
nealle
0
510
関数型まつりレポート for JuliaTokai #22
antimon2
0
150
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
260
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
570
Featured
See All Featured
Done Done
chrislema
184
16k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
We Have a Design System, Now What?
morganepeng
53
7.7k
Automating Front-end Workflow
addyosmani
1370
200k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
4 Signs Your Business is Dying
shpigford
184
22k
It's Worth the Effort
3n
185
28k
Practical Orchestrator
shlominoach
188
11k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Transcript
REPLACE WITH DAGGER.ANDROID
HELLO ABOUT ME Yuji Koketsu @kettsun0123 ▸ Android Developer ▸
CyberAgent, Inc ▸ ݩ AbemaTV >> ৽نϝσΟΞ
REPLACE WITH DAGGER.ANDROID What is dagger.android?
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
WHAT IS DAGGER.ANDROID? class MainActivity : AppCompatActivity() { lateinit var
instance: Hoge override fun onCreate(state: Bundle?) { super.onCreate(state) ... } ... }
WHAT IS DAGGER.ANDROID? class MainActivity : AppCompatActivity() { @Inject lateinit
var instance: Hoge override fun onCreate(state: Bundle?) { AndroidInjection.inject(this) super.onCreate(state) ... } ... }
REPLACE WITH DAGGER.ANDROID dagger.androidͰஔ͖͑Δ
REPLACE WITH DAGGER.ANDROID App MainActivity AppModule class Hoge
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" }
REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AppModule::class ))
interface AppComponent { fun inject(app: App) fun activityComponent(): ActivityComponent }
REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, AppModule::class
)) interface AppComponent : AndroidInjector<App> { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }
REPLACE WITH DAGGER.ANDROID ActivityComponent.kt @Subcomponent(modules = arrayOf( ... )) interface
ActivityComponent { fun inject(activity: MainActivity) }
REPLACE WITH DAGGER.ANDROID ActivityComponent.kt @Subcomponent(modules = arrayOf( ... )) interface
ActivityComponent : AndroidInjector<MainActivity> { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainActivity>() }
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<out Activity> } SubcomponentΛModuleͰbind͢Δ
REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, AppModule::class
)) interface AppComponent : AndroidInjector<App> { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }
REPLACE WITH DAGGER.ANDROID AppComponent.kt @Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, ActivityModule::class,
AppModule::class )) interface AppComponent : AndroidInjector<App> { @Component.Builder interface Builder { fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) }
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
REPLACE WITH DAGGER.ANDROID App.kt class App : DaggerApplication() { override
fun applicationInjector() = DaggerAppComponent.builder() .application(this) .build() override fun onCreate() { super.onCreate() ... } ... }
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) ... } ... }
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) ... } ... }
MORE SIMPLE ͬͱγϯϓϧʹॻ͚·͢
MORE SIMPLE @ContributesAndroidInjector Dagger v2.11 ~
MORE SIMPLE ActivityComponent.kt @Subcomponent(modules = ...) interface ActivityComponent : AndroidInjector<MainActivity>
{ @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainActivity>() }
MORE SIMPLE ActivityComponent.kt @Subcomponent(modules = ...) interface ActivityComponent : AndroidInjector<MainActivity>
{ @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainActivity>() } Component࡞Βͳͯ͘ྑ͍
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<out Activity> }
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<out Activity> } Subcomponentͷbindॻ͔ͳ͍͍ͯ͘
MORE SIMPLE ActivityBuilder.kt @Module internal abstract class ActivityBuilder { @ContributesAndroidInjector(modules
= arrayOf(...)) internal abstract fun contributeMainActivityInjector(): MainActivity } ͜Ε͚ͩͰSubcomponent͕Ͱ͖Δ
MORE SIMPLE @ContributesAndroidInjectorͰγϯϓϧʹ
FIN Thanks:)