Inject context with Hilt: this field leaks a context object

I’m using Hilt to inject context and other dependencies into my HomeViewModel class; Everything is working properly but I’m getting this warning.
How can I prevent from leakings?

This is my HomeFragment (where I inject and use the HomeViewModel class):

@AndroidEntryPoint
class HomeFragment : Fragment() {

private val viewModel: HomeViewModel by viewModels()

....

}

This is the warning:

Hilt injection viewModel

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

I’m using:

//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"

Thanks!

— Edited, as suggested, after the first given answer:

The Home Fragment now is:

enter image description here

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

}

Dependencies updated to:

//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"

And I’m still getting this leaking error.

Any ideias?

Solution #1:

I don’t get this warning, and I inject a context the same way.

Try updating to 2.31.2-alpha for hilt and 1.0.0-alpha03 for hilt-androidx

There are a few breaking changes. You will need to annotate your view models with @HiltViewModel, use @Inject instead of @ViewModelInject. And you will need to replace any references to ApplicationComponent with SingletonComponent.

Solution #2:

Your Kotlin plugin version is 1.4.30-release-Studio4.1-1?

If so, downgrade kotlin plugin version.

In 1.4.30-release-Studio4.1-1 version,

if viewmodel has context as instance variable, it causes warning.

Respondent: mikeBlack

Solution #3:

I had the same problem after updating Hilt dependencies.

It’s right to use @HiltViewModel with @Inject before the constructor.

Regarding the leak due to the Context, just remove it from the ViewModel constructor, and pass the Context as method parameter of your functions, like this:

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

    fun getImages(@ApplicationContext context: Context) {
        /* ... */
    }
}
Respondent: inkwon

Solution #4:

After I faced that warning

enter image description here

I decided to profile memory to be guaranteed that the approach causes a memory leak, but what I found is quite interesting

enter image description here

yeah, there is no leak it’s just a warning so don’t care about it anymore, happy coding đŸ˜‰

Respondent: Dario Brux

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.