29

我正在开发一个基于 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
  ...
 }

问题:有什么方法可以直接将上下文发送到 :network 模块中的网络类?

4

3 回答 3

52

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

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

...

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

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

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

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

val networkModule = module {
   single { Network(get()) }
}
于 2019-01-04T00:39:39.917 回答
15

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

于 2018-12-04T14:34:01.863 回答
6
val appModule = module {
    viewModel { LoginViewModel(androidContext()) }
}

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

于 2019-01-03T18:12:35.157 回答