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

前言
  • これはこのシリーズの第二篇
    前回の続き
    主に初期構築プロジェクトの基本的な建設
    その後の開発のために
    DI注入を導入し始めることを考えています
    今回はHiltを採用します
プロジェクト構築
  • 使用するライブラリは以下の通り:
Function
Lib
build
gradle.kts + toml
api
okhttp + retrofit2
navigation
navigation-compose
design
material 3
di
hilt
ui
jetpack compose
json
kotlinx.serialization
db
room
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サービスの開発に集中するだけで済みます

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

目次に戻る

You might also enjoy