gpt4 book ai didi

安卓MVVM。传递具有 Context 作为依赖项的对象

转载 作者:行者123 更新时间:2023-11-29 22:41:34 31 4
gpt4 key购买 nike

我有一个 viewmodel接受模型作为构造函数参数之一。 MainModelcontext (我需要它来注册 broadcastReceiver )。

class MainViewModel(private val test: MyTestReiverHandler) : ViewModel() {

}

class MyTestReiverHandler(context: Context) {
init {
val intentFilter = IntentFIlter()
intentFiler.addAction("android.net.conn.CONNECTIVITY_CHANGE")
context.registerReceiver(receiver, intentFiler)
}

fun doSomething() {
// do something....
}
}

我知道 viewmodel's不应引用 context .那么这种做法是否正确呢?或者应该所有需要 context 的东西像位置接收器,广播接收器,......应该在view中处理又名 activity等级?然后将结果传递给 viewmodel

编辑

我还将添加其他示例,我有 PermissionManager具有请求某种权限的 Activity 。我想为我所有的 viewmodels 使用那个经理拥有某种拥有 activity 的经理是个好主意吗?作为我的参数 viewmodels ?。我知道通过context是不好的, activityviews直接到我的viewmodel .但是拥有其他具有 context 的对象是否很好?或 activity (如 PermissionManager )在我的 viewModel

class MainViewModel(private val permissionManager: PermissionManager) : ViewModel() {
fun doSomethingWithLocation() {
permissionManager.requestLocationPermission({
// do something if permission granted
})
}

fun doSomethingWithCamera() {
permissionManager.requestCameraPermission({
// do something if permission granted
})
}
}

class DetailViewModel(private val permissionManager: PermissionManager) : ViewModel() {
fun doSomethingWithLocation() {
permissionManager.requestLocationPermission({
// do something if permission granted
})
}

fun doSomethingWithCamera() {
permissionManager.requestCameraPermission({
// do something if permission granted
})
}
}

class PermissionManager(activity: Activity) {

private val activityWeakRef = WeakReference(activity)

fun requestLocationPermission(onPermissionGranted: ((Boolean) -> Unit)) {
//
// Location permission implemetntation
//
}

fun requestStoragePermission(onPermissionGranted: ((Boolean) -> Unit)) {
//
// Storage permission implemetntation
//
}

fun requestCameraPermission(onPermissionGranted: ((Boolean) -> Unit)) {
//
// Camera permission implemetntation
//
}
}

最佳答案

您可以从 AndroidViewModel(application: Application) 而不是 ViewModel 扩展您的 MainViewModel。现在你可以像以前一样使用你的 MainViewModel 并且 application 实例可以用来注册你的 broadcastReceiver

class MainViewModel(application: Application) : AndroidViewModel(application) {

}

Activity/fragment

val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

这是正确且简单的方法。

should all the things that require context like location receiver, broadcast receiver, ... should be handled in view aka activity level?

不是全部。我曾经开发过一个跟踪用户位置的应用程序。由于应用程序需要在很长一段时间内跟踪用户位置,同时执行其他操作。我决定在另一个线程中进行,让 ViewModel 分别广播结果。 Repository 还需要上下文来构建 Room 数据库。 ViewModel 需要上下文来实例化存储库。这就是我们使用 AndroidViewModel 而不是 ViewModel 的原因。如果你希望你可以实现依赖注入(inject)来避免这种依赖性的东西

关于安卓MVVM。传递具有 Context 作为依赖项的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59001841/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com