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

前言
  • 這是這個系列的第二篇
    接入上集
    主要是開發一些初期建構專案的基本建設
    為了之後開發
    我會考慮開始接入DI注入
    這次我採用的是Hilt
專案建置
  • 使用的library如下:
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 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 就可以用了

跳回目錄

You might also enjoy