我可以在 ViewModel 的 init 块中获取上下文吗?

Can I get the context inside ViewModel's init block?

我正在为我的应用程序实现离线模式,我的计划是将本地数据库放在 UI 和 API 请求之间。

我有这个片段和他的带有这个初始化块的视图模型:

init {
   viewModelScope.launch(Dispatchers.IO) {
      // context required here
      loadVehicles()
   }
}

现在,在 loadVehicles 中,我想检查我是否在线,如果在线,我将简单地调用 API 来更新我的本地数据库,以防有任何新情况。

fun isOnline(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (connectivityManager != null) {
        val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (capabilities != null) {
            return true
        }
    }
    return false
}

这是我能找到的用于测试我是否在线的最简单的代码,并且此函数需要上下文,而上下文无法从视图模型的 init 块访问。

期待听到其他关于做事的建议,如果有我可以改进的地方。

您的代码“必须”如下所示:

class SomeHelperClass @Inject constructor(private val  context: Context) {

    fun isOnline(): Boolean {
        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (connectivityManager != null) {
            val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
            if (capabilities != null) {
                return true
            }
        }
        return false
    }
}


class MyViewModel @Inject constructor(helper: SomeHelperClass):ViewModel()  {
    init {
        viewModelScope.launch(Dispatchers.IO) {

            // call to helper.isOnline() !!!!!!

            loadVehicles()
        }
    }
}
  • 这就是 MyViewModel 中的代码不依赖于 Context 的方式, 这意味着不需要仪器测试。你可以测试它 普通 Kotlin/Java 测试。

  • 我知道你可能不想测试它,但其中一个很好 测试的结果是它使代码更好。 如果你让 可测试的代码,即使你不测试它也会更好。 而在 在这种情况下,您不会制作繁重的 ViewModel,这是个坏主意。

  • 此外,如果您不使用 Dagger-Hilt,我建议您使用它 已经 - @Inject