我可以在 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
我正在为我的应用程序实现离线模式,我的计划是将本地数据库放在 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