簡體   English   中英

如何使用 koin 依賴庫在模塊中注入活動上下文

[英]How to inject activity context in modules with koin dependency library

我有一個 Util 模塊,如下所示,它需要活動上下文 [不是應用程序上下文] 來完成它的一些功能。

如何將活動上下文注入其中?

class MainPresenter internal constructor(private val iMainActivity: IActivity)  : IPresenter {

    //dependencies
    private val context = iMainActivity as AppCompatActivity

    private var util = UtilModule(context)         //<-- inject this
    private var httpClient = HttpClient(context)   //<-- inject this

在這種情況下,正如@commonsware所說,presenter 類依賴於活動並不好。 使用注入更好的解決方案可以是如下結構:

class IActivity{

    private val utilModule: UtilModule by lazy { UtilModule(this@IActivity) }
    private val httpClient: HttpClient by lazy { HttpClient(this@IActivity) }

    private val presenter: MainPresenter by inject{ parametersOf(utilModel, 
    httpClient) }

}

class MainPresenter(private val util: UtilModule, private val httpClient: HttpClient)

您的模塊:

single { MainPresenter( it[0], it[1] ) }

您可以使用 koin 生命周期擴展將活動/片段實例動態附加到范圍實例注冊表中。

val definition = BeanDefinition(
    scopeDefinition = this._scopeDefinition,
    primaryType = T::class,
    kind = Kind.Single,
    definition = { instance() }
)

val instanceMap = lifecycleScope._instanceRegistry.instances as HashMap<IndexKey, InstanceFactory<*>>
val factory = SingleInstanceFactory(this._koin, definition)
instanceMap[indexKey(T::class, null)] = factory

然后將其注入范圍定義:

scope<SomeActivity> {
    // inject activity with Scope.get()
    scoped { SomeModule(get()) }
}

最后,注入lifecycleScope:

val someModule: SomeModule by lifecycleScope.inject()

我寫了一個演示來解釋它是如何工作的: https : //github.com/twiceyuan/KoinAndroidComponentInject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM