我有一个viewmodel
接受模型作为构造函数参数之一。MainModel
有context
(我需要注册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
活动来询问某种权限的示例。我想对所有经理都使用该管理器。viewmodels
是否有某种类型的管理器activity
作为参数viewmodels
?我知道这是不好过context
,activity
或views
直接到我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。现在您可以像使用befor一样使用MainViewModel,并且可以使用应用程序实例注册您的broadcastReceiver
class MainViewModel(application: Application) : AndroidViewModel(application) {
}
在活性/片段
val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
这是正确和容易的。
应该在需要上下文的所有事物(例如位置接收器,广播接收器等)中以活动级别进行处理吗?
不是所有的人。我曾经在跟踪用户位置的应用程序上工作。由于该应用需要长时间跟踪用户位置,并且其他操作同时进行。我决定在另一个线程中执行此操作,并让ViewModel分别广播结果。存储库还需要上下文来构建Room数据库。ViewModel将需要上下文来实例化存储库。这就是为什么我们在ViewModel上有AndroidViewModel的原因。如果您愿意,可以实现依赖注入以避免这种依赖。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句