Android Hilt Componentsを紹介する

#### アジェンダ
* Hiltとは
* 導入手順
* Hilt Application
* Components
* Moduleの作り方
* Activity, Fragmentでinject方法

----

## Hiltとは

----

#### 背景
* Dagger - Square社が開発したもの
* Dagger2 - GoogleがDaggerをforkして通称Dagger2を作っている
* Dagger2 + Android
    * Dagger Android Supportの複雑性
    * components and scopesが標準ではない
    * マルチモジュールの流れと相性が悪く
* Android Hilt 

----

#### 最新バージョン
* https://search.maven.org/search?q=g:com.google.dagger%20hilt
* 2.28.3-alpha(2020.09.07時点)
* まだalpha版ですが、ドキュメントがある
    * https://dagger.dev/hilt/

----

#### メリット
* 使い方が簡単になる
* 標準化になる

----

## 導入手順

----

#### build dependencies

```
dependencies {
  implementation 'com.google.dagger:hilt-android:<VERSION>'
  kapt 'com.google.dagger:hilt-android-compiler:<VERSION>'

  // For instrumentation tests
  androidTestImplementation  'com.google.dagger:hilt-android-testing:<VERSION>'
  kaptAndroidTest 'com.google.dagger:hilt-android-compiler:<VERSION>'

  // For local unit tests
  testImplementation 'com.google.dagger:hilt-android-testing:<VERSION>'
  kaptTest 'com.google.dagger:hilt-android-compiler:<VERSION>'
}

kapt {
 correctErrorTypes true
}

```

----

#### Plugin設定

```
buildscript {
  repositories {
    // other repositories...
    mavenCentral()
  }
  dependencies {
    // other plugins...
    classpath 'com.google.dagger:hilt-android-gradle-plugin:<version>'
  }
}

```

```
apply plugin: 'com.android.application'
apply plugin: 'dagger.hilt.android.plugin'

android {
  // ...
}

```

----

#### プラグインを使う理由
* プラグインを使わないと、親クラスをアノテーションで指定しないといけない

```
@HiltAndroidApp(MultiDexApplication.class)
public final class MyApplication extends Hilt_MyApplication {}
```

* プラグインを使う

```
@HiltAndroidApp
public final class MyApplication extends MultiDexApplication {}
```


----








## Hilt Application

----


#### before

方法1 

```
public final class MyApplication extends MyBaseApplication {
  @Inject Bar bar;

  @Override public void onCreate() {
    super.onCreate();

    MyComponent myComponent =
        DaggerMyComponent
            .builder()
            ...
            .build();

    myComponent.inject(this);
  }
}

```

方法2

* DaggerApplication導入



----

#### after

```
@HiltAndroidApp
class App : Application() {
}
```

----

## Components


----

#### Component lifetimes

Hiltでは
* Application
* Activity
* Fragment
* Service
* View
のライフサイクルがあらかじめ定義されている
 
----

#### Component default bindings
|Component          |	Default Bindings|
|:-----------|------------:|
|SingletonComponent |	Application|
|ActivityComponent |	Application, Activity|
|FragmentComponent |	Application, Activity, Fragment|
|ViewComponent 	   |Application, Activity, View|
|ServiceComponent |	Application, Service|

----

## Module

----

* Moduleにこのライフサイクルを定義するには、@InstallIn annotationを使います。

```
@Module
@InstallIn(SingletonComponent::class)
object class FooModule {
  @Provides
  @Singleton
  fun provideBar(): Bar {...}
}

```

----

## Activity, Fragmentでinject方法

----

```
@AndroidEntryPoint
class MyActivity : MyBaseActivity() {
  // Bindings in SingletonComponent or ActivityComponent
  @Inject lateinit var bar: Bar

  override fun onCreate(savedInstanceState: Bundle?) {
    // Injection happens in super.onCreate().
    super.onCreate()

    // Do something with bar ...
  }
}

```



----

## 感想
* 新機能の追加がなし
* 使いやすくなる
* injectのやり方はほぼ変わっていないので、実装済み場合はHiltへ変更がいらないはず