如何在 Android 上将 viewmodel 中的上下文与 Hilt 一起使用

How to use context in viewmodel with Hilt on Android

提问人:Jojo Drink 提问时间:10/16/2023 更新时间:10/19/2023 访问量:90

问:

在我的应用程序中,我使用了 MVVM 并且我有 ViewModel,但我想将上下文访问到 viewModel
我将以下代码写入 ViewModel 中:

@HiltViewModel
class SimpleViewModel @Inject constructor(
    private val repository: SimpleRepository, @ApplicationContext val context: Context
) : ViewModel() {

但是在上下文中向我显示警告并向我显示此消息:This field leaks a context object

将上下文访问到视图模型的最佳方式是什么?

Kotlin MVVM Android-ViewModel

评论


答:

2赞 cesonha 10/16/2023 #1

正如本答案中所述,使用时不会发生泄漏,因为上下文将始终比视图模型实例更长,这只是一个误报警告,您甚至可以通过使用内存探查器来确认不会发生。@ApplicationContext

您可以通过向 View Model 类添加来忽略该警告。@SuppressLint("StaticFieldLeak")

评论

0赞 Jojo Drink 10/16/2023
所以,没关系,没有任何问题。是的?
0赞 cesonha 10/16/2023
是的,您可以禁止显示此警告。
0赞 Dinesh Meda 10/16/2023 #2

在 viewModels 或 android 中的任何非活动文件中,上下文都在那里 如果你想要上下文,那么你必须创建一个应用程序文件,并在清单应用程序中声明应用程序文件名,如

android:name = ".ApplicationFile"

在该 applicationFile 中,您必须编写一个类似

val applicationScope = CoroutineScope(SupervisorJob())

override fun onCreate() {
    super.onCreate()
    appContext = applicationContext
    appPreferences = AppPreference(applicationContext)
}
companion object{
    var appPreferences: AppPreference? = null

    lateinit var appContext:Context
}in viewModels or in any non activity file in android the context is there

如果你想要上下文,那么你必须创建一个应用程序文件,并在清单应用程序中声明应用程序文件名,如

android:name = ".ApplicationFile"

在该 applicationFile 中,您必须编写一个类似 val applicationScope = CoroutineScope(SupervisorJob())

override fun onCreate() {
    super.onCreate()
    appContext = applicationContext
    appPreferences = AppPreference(applicationContext)
}
companion object{
    var appPreferences: AppPreference? = null

    lateinit var appContext:Context
}
0赞 HT__ 10/17/2023 #3

在我看来,在 MVVM 中,我们不需要 viewModel 中的上下文,因为如果视图需要上下文,那么在 Activity/Fragment/View 本身中使用上下文。但是,如果需要上下文来启动存储库中的库(例如改造、房间等),请使用 Hilt 中的应用程序上下文。

请随时评论我的意见,因为我还在学习。