コツ:
dagger や hilt 系の記事は古い記事が検索でヒットして混乱するので注意。
✅ @HiltAndroidApp
Application クラスに付ける。
✅ @AndroidEntryPoint
Android クラスに付ける。最低でも ViewModel をktx経由で inject するのでほぼ必須。
Activity / Fragment / Service /
✅ @HiltViewModel
AAC ViewModel クラスにつける。Repository を取り込むためにconstructor に @Inject も付ける。
✅ @Inject
コンストラクタ - constructor に付けてインスタンス名と型を明示する。
フィールド - @AndroidEntryPoint を付けたクラス内のフィールドに付ける。private であってはならない。
→ Android クラスでなければ フィールドインジェクションはできない。
→ ViewModel の Android クラスへのフィールドインジェクションでは不要。
✅ @Module / @InstallIn
コンストラクターで注入できない型のバインディングを追加できるクラス。
→ di/ 以下に置く。
→ 基本 @InstallIn(SingletonComponent::class)
→ RepositoryModule @InstallIn(ViewModelComponent::class)
Hiltで生成されたDIコンテナ(コードではSingletonComponent)モジュールバインディングが使用可能である必要があることを示します。
コンストラクターで注入できない型のバインディングを追加します。
-戻り型はバインディング型です。
-パラメータは依存関係です。
-型がスコープされていない場合、インスタンスが必要になるたびに、関数本体が実行されます。
→ 基本 @Provides @Singleton
→ ReposirotyModule @Provides ViewModelScoped
✅ @Binds
インターフェイスタイプをバインドするための省略形:
-メソッドはモジュール内にある必要があります。
-@ Bindsアノテーション付きメソッドは抽象でなければなりません。
-リターンタイプはバインディングタイプです。
-パラメータは実装タイプです。
✅ Scope Annotations :
オブジェクトをコンテナにスコープします。
タイプの同じインスタンスは、そのタイプを依存関係として使用する場合、フィールドインジェクションのために、または階層の下のコンテナーによって必要とされる場合に、コンテナーによって提供されます。
✅ Qualifers for predefned Bindings:
@ApplicationContext / @ ActivityContext対 応するコンテナーの依存関係として使用できる事前定義されたバインディング。これらは修飾子の注釈です。
✅ @EntryPoint
Hiltで直接サポートされていないか、Hiltを使用できないクラスの依存関係を取得-します。 @EntryPointアノテーションが付けられたインターフェースは、その依存関係の取得元であるHilt定義済みコンポーネントを渡す@InstallInアノテーションも付けられている必要があります。 DIコンテナ(@InstallInアノテーションの値と一致する)とエントリを持つクラスのインスタンスを渡すEntryPointAccessorsから適切な静的メソッドを使用してバインディングにアクセスします
MVVM で Hilt のパターン化 💉 | #android ファショ通
👉 https://android.benigumo.com/20211209/mvvm-hilt/