Android 用Jektpack Compose 來開発app【02】 - DI注入篇
- これはこのシリーズの第二篇
前回の続き
主に初期構築プロジェクトの基本的な建設
その後の開発のために
DI注入を導入し始めることを考えています
今回はHiltを採用します
- 使用するライブラリは以下の通り:
-
Hiltを使用するためには以下のtomlを設定する必要があります
主にhiltライブラリと、hiltを導入するためにkspを使用します
-
build.gradle.kts(:app)にプラグインを追加
-
build.gradle.kts(:yourAppName)に導入:
-
build.gradle.kts(:app)に導入:
- 公式ドキュメントに記載されています
Hiltを導入するには必ず@HiltAndroidApp
を含める必要があります
そのため、Applicationを実装します
実際に追加しないと、以下のエラーが発生します:
Caused by: java.lang.IllegalStateException: Hilt Activity must be attached to an @HiltAndroidApp Application. Did you forget to specify your Application's class name in your manifest's application 's android:name attribute?
-
上記の設定が完了したら
hiltはクラスの先頭に@AndroidEntryPoint
を追加した場所でinject機能を提供します -
それでは、Hiltを使用したViewmodelを試してみましょう
実際の使用例:
- DIは必要なクラスを提供するためにモジュールを追加できます
DIを通じてインスタンスを生成してくれます
以下の例のように
主にネットワークリクエスト関連のモジュールとして使用されます
provideKotlinxJsonConverter
はJson形式を解析するコンバータを提供します
provideCustomConverter
はHTTPリクエストのレスポンス形式を定義するためのものです
provideBaseRetrofitBuilder
はRetrofitのインスタンスを提供します
上記のソースコードには@Named("xxx")
という行があります
これはインスタンスの名前を示すためのものです
例えば、プロジェクトに複数の異なる設定が必要な場合
関数の最上部に@Named(“yourName”)を追加することで
Hiltがコンパイル時にどのインスタンスを注入するかを判断できます
社内のバックエンドが提供するAPIや外部の第三者サービスが提供するAPIなど
異なるレスポンス状況のAPIに遭遇する可能性があります
このような形式でインスタンスを生成することができます
@Namedを追加しなくてもビルドは可能です
ただし、Hiltは唯一のインスタンスを見つけて注入します
実際の使用例:
-
DIを使用して注入すると、自分でクラスのインスタンスを初期化する必要がなくなります
DIを通じて処理され、うまく使用すれば
コードがよりシンプルで読みやすくなります
上記の例では、kotlinx.serializer
を定義して固定のJsonをクラスに解析します
old-custom
環境には旧サーバーからの内容が残っています
そのため、旧版の定義された形式で解析します
un-auth
はOkHttpClientを定義し、Debug環境でのみHttpLoggingInterceptorを追加してログを解析します
最終的にprovideFeedbackUcService
が提供するAPIサービスには、上記の特性が含まれています -
この例を通じて理解できることは
サーバーがどのように変化しても
上記の方法を使用することで簡単に
望む最終形を組み立てることができます
一度書いてしまえば
多くの重複したコードを書くことを避けることができます
例えば、ネットワークリクエスト
サーバーが提供する仕様が同じであれば
APIサービスの開発に集中するだけで済みます -
最後に、これらのインスタンスを使用する必要がある場合は、コンストラクトで直接注入するだけで使用できます