KC Blog

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

5 min read
UIFramework#Android#Kotlin
前言
* 這是這個系列的第二篇

接入上集

主要是開發一些初期建構專案的基本建設

為了之後開發

我會考慮開始接入DI注入

這次我採用的是Hilt

專案建置
* 使用的library如下:
{% include table/compose-use.html %} {% include table/compose-category.html %}
導入DI注入 - Hilt
step1. 導入Hilt & KSP
* 為了使用Hilt 所以需要配置以下的toml

主要是hilt library跟 導入hilt會用到ksp

  • 在build.gradle.kts(:app)中 加入plugin
  • 在build.gradle.kts(:yourAppName)中導入:
  • 在build.gradle.kts(:app)中導入:
step2. 實作Hilt application
* 官方文件有提到

加入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. 可以開始注入class了
* 當上面配置好之後

hilt會在class頭有加入@AndroidEntryPoint的地方提供inject的功能

  • 那就來試試吧做一個使用Hilt的Viewmodel

實際使用:

加入module
* DI可以加入module來提供需要的class

並透過DI幫你產生instance

像是下面這個例子

主要是拿來做網路請求相關的module

provideKotlinxJsonConverter這個就是拿來提供一個解析Json格式的converter

provideCustomConverter是拿來提供定義http request的response格式

provideBaseRetrofitBuilder是拿來提供Retrofit的instance

上面的source code都會看到有一行@Named("xxx")

這個是用來標示這個instance的名字是哪個

假設今天你的專案剛好有多個不同的配置要產生

可以在function最上面加入@Named("yourName")

則可以讓Hilt在編譯的時候判斷你要注入的是哪個instance

不管是公司內部Backend提供的Api或是外部第三方服務提供的api

可能會遇到不同response情況的API

所以就可以透過這種形式幫你產生instance

沒加@Named也可以build

不過Hilt就是找到唯一有的那個幫你注入

實際使用:

  • 使用DI注入後面就可以不用自己主動去初始化取得class的instance

透過DI幫你處理,若使用的不錯

也會讓code看起來更簡潔、更易讀

像是上面這個例子我定義了kotlinx.serializer用來解析固定的Json to class

old-custom環境中有舊的服務端留下來的內容

所以我用舊版定義的格式去解他

un-auth定義一個OkHttpClient其中只在Debug環境中加入HttpLoggingInterceptor來解析log

最終在 provideFeedbackUcService提供的API Service則有我上面提到的這些特性

  • 透過這個例子了解到

不管服務端再怎麼變化

我們透過上面這種方法就能輕鬆

把想要的最後形狀組出來

寫好之後

也能避免寫很多重複的代碼

例如:網路請求

如果服務端提供的規格都一樣

那只需要專注於開發API service就可以

  • 最後 當你需要取用這些instance只要直接在construct那邊inject 就可以用了

跳回目錄