傳遞參數 - 注入參數
在任何定義中,您都可以使用注入參數:這些參數將被注入並由您的定義使用。
傳遞值以進行注入
給定一個定義,您可以將參數傳遞給該定義:
kotlin
class Presenter(val a : A, val b : B)
val myModule = module {
single { params -> Presenter(a = params.get(), b = params.get()) }
}參數透過 parametersOf() 函式傳送至您的定義中(每個值以逗號分隔):
kotlin
class MyComponent : View, KoinComponent {
val a : A ...
val b : B ...
// 將此注入為 View 值
val presenter : Presenter by inject { parametersOf(a, b) }
}定義「注入參數」
以下是注入參數的範例。我們確定需要一個 view 參數來建置 Presenter 類別。我們使用 params 函式引數來協助擷取注入參數:
kotlin
class Presenter(val view : View)
val myModule = module {
single { params -> Presenter(view = params.get()) }
}您也可以直接使用參數物件將注入參數編寫為解構宣告:
kotlin
class Presenter(val view : View)
val myModule = module {
single { (view : View) -> Presenter(view) }
}CAUTION
即使「解構」宣告更方便且更具可讀性,但它並非型別安全。如果您有多個值,Kotlin 將無法偵測傳遞的型別順序是否正確。
依序解析注入參數
如果您有多個相同型別的參數,可以使用索引來解析參數,例如 get(index)(與 [ ] 運算子相同),而不是使用 get():
kotlin
class Presenter(val view : View)
val myModule = module {
single { p -> Presenter(p[0],p[1]) }
}從圖形中解析注入參數
Koin 圖形解析(所有定義解析的主樹)也允許您尋找注入參數。只需使用常用的 get() 函式即可:
kotlin
class Presenter(val view : View)
val myModule = module {
single { Presenter(get()) }
}注入參數:索引值或集合 (3.4.3)
除了 parametersOf 之外,還可以使用以下 API:
parameterArrayOf:使用值陣列,且資料將透過其索引使用
kotlin
val params = parameterArrayOf(1,2,3)
params.get<Int>() == 1
params.get<Int>() == 2
params.get<Int>() == 3
params.get<Int>() == 3parameterSetOf:使用一組具有不同種類的值。不使用索引來輪詢值。
kotlin
val params = parameterSetOf("a_string", 42)
params.get<Int>() == 42
params.get<String>() == "a_string"
params.get<Int>() == 42
params.get<String>() == "a_string"預設函式 parametersOf 可同時處理索引與值集合:
kotlin
val params = parametersOf(1,2,"a_string")
params.get<String>() == "a_string"
params.get<Int>() == 1
params.get<Int>() == 2
params.get<Int>() == 2
params.get<String>() == "a_string"NOTE
您可以使用 parametersOf 或 parameterArrayOf 來「級聯」參數注入,以便根據索引取用值。或者使用 parametersOf 或 parameterSetOf 根據型別進行級聯解析。
CAUTION
如果透過 parametersOf 傳遞的值與要求的定義具有相同的型別,Koin 會直接回傳該值並略過工廠區塊。當參數可能與定義的回傳型別衝突時,請為參數使用包裝型別(例如 value class)。
