KC Blog

Android 用Jektpack Compose 來開発app【02】 - DI注入篇

6 min read
UIFramework#Android#Kotlin
前言
* これはこのシリーズの第二篇

前回の続き

主に初期構築プロジェクトの基本的な建設

その後の開発のために

DI注入を導入し始めることを考えています

今回はHiltを採用します

プロジェクト構築
* 使用するライブラリは以下の通り:
{% include table/compose-use.html %} {% include table/compose-category.html %}
DI注入の導入 - Hilt
step1. Hilt & KSPの導入
* Hiltを使用するためには以下のtomlを設定する必要があります

主にhiltライブラリと、hiltを導入するためにkspを使用します

  • build.gradle.kts(:app)にプラグインを追加
  • build.gradle.kts(:yourAppName)に導入:
  • build.gradle.kts(:app)に導入:
step2. Hiltアプリケーションの実装
* 公式ドキュメントに記載されています

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?

step3. クラスの注入を開始できます
* 上記の設定が完了したら

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サービスの開発に集中するだけで済みます

  • 最後に、これらのインスタンスを使用する必要がある場合は、コンストラクトで直接注入するだけで使用できます

目次に戻る