Android 用Jektpack Compose 來開発app【02】 - DI注入篇
前回の続き
主に初期構築プロジェクトの基本的な建設
その後の開発のために
DI注入を導入し始めることを考えています
今回はHiltを採用します
主に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を通じてインスタンスを生成してくれます
以下の例のように
主にネットワークリクエスト関連のモジュールとして使用されます
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サービスの開発に集中するだけで済みます
- 最後に、これらのインスタンスを使用する必要がある場合は、コンストラクトで直接注入するだけで使用できます