使用 Hilt 注入上下文:此字段泄漏上下文对象

Inject context with Hilt: this field leaks a context object

我正在使用 Hilt 将上下文和其他依赖项注入我的 HomeViewModel class;一切正常,但我收到此警告。 如何防止泄漏?

这是我的 HomeFragment(我在其中注入并使用 HomeViewModel class):

@AndroidEntryPoint
class HomeFragment : Fragment() {

private val viewModel: HomeViewModel by viewModels()

....

}

这是警告:

class HomeViewModel @ViewModelInject constructor(
    @ApplicationContext val context: Context,
    private val locationAPI: LocationAPI,
    private val imagesAPI: ImagesAPI
) :
    ViewModel() {
...
}

我正在使用:

//Hilt DI
implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"

谢谢!

-- 根据建议,在第一个给出的答案之后进行编辑:

Home Fragment 现在是:

@HiltViewModel
class DetailsViewModel @Inject constructor(
    @ApplicationContext val context: Context,
    private val locationDetailsAPI: LocationAPI) :
    ViewModel() {
...

}

依赖更新为:

//Hilt DI
implementation "com.google.dagger:hilt-android:2.31-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha03"

我仍然遇到这个泄漏错误。

有什么想法吗?

我没有收到此警告,我以同样的方式注入上下文。

尝试将 hilt 更新到 2.31.2-alpha,将 hilt-androidx 更新到 1.0.0-alpha03

有一些重大变化。您需要使用@HiltViewModel 注释您的视图模型,使用@Inject 而不是@ViewModelInject。您需要用 SingletonComponent 替换对 ApplicationComponent 的任何引用。

您的 Kotlin 插件版本是 1.4.30-release-Studio4.1-1?

如果是,请降级 kotlin 插件版本。

在1.4.30-release-Studio4.1-1版本中,

如果视图模型将上下文作为实例变量,则会导致警告。

我在更新 Hilt 依赖项后遇到了同样的问题。

构造函数前用@HiltViewModel@Inject是对的

关于 Context 导致的泄漏,只需将其从 ViewModel 构造函数中删除,并将 Context 作为函数的方法参数传递,如下所示:

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val locationDetailsAPI: LocationAPI,
    private val imagesAPI: ImagesAPI
) : ViewModel() { 

    fun getImages(context: Context) {
        // do something
    }
}

在我遇到那个警告之后

我决定分析内存以确保该方法会导致内存泄漏,但我的发现非常有趣

是的,没有泄漏这只是一个警告所以不要再关心它了,快乐编码;)

改为注入应用程序:

@Inject constructor(private val application: Application)

然后你可以像这样获取应用上下文:

application.applicationContext

这里应该是安全的,上下文构造函数中并没有真正的泄漏,只是 lint 检查不知道那是应用程序上下文,而不是其他上下文。而且我认为我认为取消该警告也是安全的。 要使用 Memory Profiler 检查内存使用情况,请阅读此文档:https://developer.android.com/studio/profile/memory-profiler