Hiltに会う-JetPackの依存関係インジェクション(DI)ですが、HiltはDagger2の単なるラッパーであるため、そうではありません。小規模なプロジェクトの場合、より便利なツールとして立ち上がることができ、他のJetPack製品とうまく統合できます。
プロジェクトに追加する方法については説明しません。すべてが記事で詳しく説明されています。
何のために?
Dagger2はかなり複雑なDIであるため、何をどこに置くかを簡単に混乱させる可能性があります。無限の数のコンポーネントを考え出し、抽象化の数を増やします。そして、プロジェクトが大きくなるほど、混乱が増します。
また、Dagger2を使用したいが、最小限の労力で使用したい場合は、Hiltがこのために発明されました。
私たちのために単純化されたもの:
- 既製のコンポーネント(名前から、それらが何を指しているのかは明らかです)
- ApplicationComponent
- ActivityRetainedComponent
- ActivityComponent
- FragmentComponent
- ViewComponent
- ViewWithFragmentComponent
- ServiceComponent
- モジュールで、追加するコンポーネントを指定します
- @AndroidEntryPoint Hiltを介して、コンパイラはコンポーネントの作成と保存のためにボリエプレート全体を生成します(たとえば、ActivityRetainedComponentは画面の回転後にエンティティを保存し、ActivityComponentは再作成します)。
このコードはかなりエレガントに見えます(ボイラープレート全体が生成されます)
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
@Inject lateinit var testService: TestService
}
特徴:
申し込みが必要です
アプリケーションを宣言し、@ HiltAndroidAppをマークする必要があります。これがないと、Hiltは機能しません。
@HiltAndroidApp
class App : Application() { }
階層的な依存関係
Hilt , Activity @AndroidEntryPoint
View @WithFragmentBindings Fragment @AndroidEntryPoint, Activity Fragment
Dagger2, , @InstallIn. , .
@InstallIn(ApplicationComponent::class)
@Module
class NetworkModule {
@Singleton
@Provides
fun provideHttpService(): HttpService {
return object : HttpService {
init {
Log.e("Tester", "HttpService initialized")
}
override fun request() {
Log.e("Tester", "HttpService::request")
}
}
}
}
Hilt, @InstallIn, , .
Component Subcomponent
, Dagger2, Hilt . :
DaggerLoginComponent.builder()
.context(this)
.appDependencies(
EntryPointsAccessors.fromApplication(
applicationContext,
LoginModuleDependencies::class.java
)
)
.build()
.inject(this)
@AndroidEntryPoint
- Activity ComponentActivity AppCompatActivity
- Fragment androidx.Fragment
- Retain
Hilt :
- Dagger Component-
- Application, Activity, Fragment, View ., @AndroidEntryPoint
- Dagger
ActivityRetainedComponent
ViewModel arch :
this.viewModelProvider =
new ViewModelProvider(
activity,
new ViewModelProvider.Factory() {
@NonNull
@Override
@SuppressWarnings("unchecked")
public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
ActivityRetainedComponent component =
((GeneratedComponentManager<LifecycleComponentBuilderEntryPoint>)
activity.getApplication())
.generatedComponent()
.retainedComponentBuilder()
.build();
return (T) new ActivityRetainedComponentViewModel(component);
}
});
:
- Dagger2
- ( )
- boilerpate .
- Dagger2 ( , ..)
:
- , , Dagger2
- ,
- Dagger2
- , , Fragment Activity c @AndroidEntryPoint
:
- https://developer.android.com/training/dependency-injection/hilt-android
- https://developer.android.com/training/dependency-injection/hilt-multi-module
- https://medium.com/androiddevelopers/dependency-injection-on-android-with-hilt-67b6031e62d
- https://codelabs.developers.google.com/codelabs/android-dagger-to-hilt/