繁体   English   中英

如何使用 Koin DI 将应用程序上下文从“app”模块注入到“.network”模块

[英]How to Inject application context from 'app' module to 'network' module using Koin DI

我正在开发一个基于 Koin DI(版本:1.0.1)的应用程序,带有 2 个模块(:app 和 .network)。 我在 .network 模块中要求有“上下文”。 以下是我的实施方式:

**Module**:
val appModule = module {
    viewModel { LoginViewModel(get()) }
}

**Activity**:
private val viewModel by viewModel<LoginViewModel>()

**ViewModel**:
class LoginViewModel(val context: Context): ViewModel() {
  ...
  // Send "context" to network class in :network module
  ...
 }

问题:有什么办法可以直接把context发送到.network模块中的.network class?

@Rajat 和 @Andrey 的两个答案都是正确的。 事实上,如果您查看源代码,您会发现androidContext()只是get()的扩展函数,因此这两个定义是相同的:

val appModule = module {
    viewModel { LoginViewModel(get()) }
}

...

val appModule = module {
    viewModel { LoginViewModel(androidContext()) }
}

回答你的问题,因为get()androidContext()module DSL 对象的成员,你可以这样做:

val networkModule = module {
   single { Network(androidContext()) }
}

或者简单地(为了简洁起见,我更喜欢这个):

val networkModule = module {
   single { Network(get()) }
}

应用程序上下文可通过函数androidContext()在模块内使用。

val appModule = module {
    viewModel { LoginViewModel(androidContext()) }
}

这应该可以解决您的问题。

其他注入上下文的方法是使用 Koin 的 Constructor DSL:

val appModule = module {
    viewModelOf(::LoginViewModel)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM