![]() |
ビッグデータを支える技術―刻々とデータが脈打つ自動化の世界 (WEB DB PRESS plus) 新品価格 |
Daggerの本読んだだけだとよく分からないので
実際にInjectしてみた
ApplicationクラスにDaggerを定義
class MyApplication : Application(), HasAndroidInjector {
//DispatchingAndroidInjectorがTとTのFactoryのMappingを返すらしい
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun onCreate() {
super.onCreate()
DaggerAppComponent.create().inject(this)
}
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
}
AppComponentはDaggerの一番最初のやつ
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
MainActivityModule::class
]
)
interface AppComponent {
fun inject(app: MyApplication)
}
AppModuleにInjectされるインスタンスを書く
@Module
class AppModule {
@Provides
@Singleton
fun provideMasterka(): Masterka {
return Masterka()
}
}
MainActivityModuleにInjectするActivityを記述
@Module(subcomponents = [MainActivitySubComponent::class])
interface MainActivityModule {
@Binds //インタフェース経由でBindする
@IntoMap //IntoMapでMapに入れてくれる。
@ClassKey(MainActivity::class)
fun bindMainActivitySubcomponentFactory(
factory: MainActivitySubComponent.Factory
): AndroidInjector.Factory<*>
}
MainActivitySubComponentにInjectするFactoryを記載
//AndroidInjectorがTにメンバーをinjectする
//AndroidInjector.FactoryがTをオブジェクトクラスに登録する
@ActivityScope
@Subcomponent
interface MainActivitySubComponent : AndroidInjector<MainActivity> {
@Subcomponent.Factory
interface Factory : AndroidInjector.Factory<MainActivity>
}
Scopeは独自に定義
//annotation classは、Javaでは@interfaceに当たります。 @Scope @Retention(AnnotationRetention.RUNTIME) internal annotation class ActivityScope
MainActivity
class MainActivity : AppCompatActivity() {
@Inject
lateinit var masterka: Masterka
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow()
}
Log.e("masterka", "masterka:$masterka")
}
}
InjectするMasterka
class Masterka {
}
これでInjectされましたとさ
なかなか難しいなぁって感想です
ここからAndroid Supportを使ったりFragmentにinjectしたりしていく予定
続くよ
関連記事:
- [書評] Master of Daggerを読んだ
- @ContributesAndroidInjectorを使ってActivityにDaggerでInjectする
- DaggerのAndroid Supportを使ってみた
