我正在将应用程序迁移到MVVM和干净的体系结构,而我却失去了其中的一部分
问题域:
列出设备上的所有应用程序并显示它们(碎片/活动)
设备应用程序由其包名称表示:
data class DeviceApp(val packageName: String)
这是列出设备应用程序的方式:
private fun listAllApplications(context: Context): List<DeviceApp> {
val ans = mutableListOf<DeviceApp>()
val packageManager: PackageManager = context.applicationContext.packageManager
val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
for (applicationInfo in packages) {
val packageName = applicationInfo.packageName
ans.add(DeviceApp(packageName))
}
return ans
}
据我了解,调用listAllApplications()应该在ViewModel调用的Domain Layer内的UseCase中完成
但是listAllApplications()接收上下文,并且域层应仅是纯代码
在干净的体系结构/ MVVM中,我应该将listAllApplications(context)放在哪一层
更一般而言,ViewModel应该如何与需要上下文(位置等)的android框架API进行交互?
域层应仅是纯代码。
没错!
,但我认为这是部分正确的。现在考虑您的方案,您需要在域级别使用context
。您不应该在域级别使用context
,但是在需要时,您应该选择其他体系结构模式,或者将其视为执行此操作的特殊情况。考虑到您在域中使用上下文,尽管applicationContext
,您仍应始终使用activity context
,因为更早的过程会持续进行整个过程。[无论何时需要在ViewModel上使用ViewModel应该如何与需要上下文(位置等)的android框架API进行交互?
Context
,您都可以从UI作为方法参数(即viewModel.getLocation(context)
)]提供它,或者将AndroidViewModel
用作ViewModel
的父类(它提供[ C0]通过ViewModel访问上下文的公共方法)。我想向您指出的是,请确保不要在ViewModel / Domain层内意外地全局保存任何View / Context,因为它可能造成灾难,例如内存泄漏或崩溃,甚至更糟。