Внедрить контекст с помощью Hilt: это поле пропускает объект контекста

Я использую Hilt для внедрения контекста и других зависимостей в мой класс HomeViewModel; Все работает правильно, но я получаю это предупреждение. Как я могу предотвратить утечки?

Это мой HomeFragment (куда я ввожу и использую класс HomeViewModel):

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

Спасибо!

-- Отредактировано, как было предложено, после первого данного ответа:

Домашний Фрагмент теперь:

введите здесь описание изображения

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

И я все еще получаю эту ошибку утечки.

Есть идеи?


person Tarsila Costalonga    schedule 15.02.2021    source источник
comment
Если вам нужен контекст, почему бы просто не использовать AndroidViewModel? не уверен насчет утечки HILT.   -  person ADM    schedule 16.02.2021
comment
Если вы публикуете изображения кода, скопируйте/вставьте или введите фактический код непосредственно в сообщение. См. Почему я не могу загружать изображения кода на SO, когда задаю вопрос?. Посты, в которых основной текст содержится только в изображениях, скорее всего, будут закрыты из-за недостаточной детализации.   -  person Ryan M    schedule 16.02.2021
comment
Удалось ли вам найти решение этой проблемы? Я столкнулся с той же проблемой, и я пытался обновить зависимости до последних версий, но безрезультатно.   -  person Walter Berggren    schedule 27.04.2021
comment
Нет, @WalterBerggren, я не смог. Но я думаю, что вы используете этот способ вообще не проблема, проверьте последний ответ, данный на этот пост. Товарищ сделал тест и заверил, что это не утечка памяти, а просто предупреждение.   -  person Tarsila Costalonga    schedule 01.05.2021


Ответы (4)


Я не получаю этого предупреждения и точно так же ввожу контекст.

Попробуйте обновить до версии 2.31.2-alpha для hilt и 1.0.0-alpha03 для hilt-androidx.

Есть несколько критических изменений. Вам нужно будет аннотировать свои модели представления с помощью @HiltViewModel, используйте @Inject вместо @ViewModelInject. И вам нужно будет заменить любые ссылки на ApplicationComponent на SingletonComponent.

person mikeBlack    schedule 16.02.2021
comment
Привет, я обновил зависимости и изменил код, но все равно получаю предупреждение. Любые идеи о том, что мне не хватает? - person Tarsila Costalonga; 16.02.2021
comment
Странный. Убедитесь, что вы обновили плагин hilt-android-gradle до версии 2.31.2-alpha.... Также проверьте, есть ли обновление для студии Android. У меня 4.1.2 - person mikeBlack; 17.02.2021
comment
Я также использую AS 4.2, а версия 2.33-beta. Тем не менее предупреждение приходит для меня. - person Tarun; 11.07.2021

После того, как я столкнулся с этим предупреждением

введите здесь описание изображения

Я решил профилировать память, чтобы гарантировать, что этот подход вызывает утечку памяти, но то, что я обнаружил, довольно интересно.

введите здесь описание изображения

да, утечки нет, это просто предупреждение, так что не обращайте на это внимания, удачного кодирования ;)

person Mostafa Anter    schedule 17.03.2021

Ваша версия плагина Kotlin — 1.4.30-release-Studio4.1-1?

Если это так, понизьте версию плагина kotlin.

В версии 1.4.30-release-Studio4.1-1,

если модель представления имеет контекст в качестве переменной экземпляра, это вызывает предупреждение.

person inkwon    schedule 17.02.2021

У меня была такая же проблема после обновления зависимостей Hilt.

Правильно использовать @HiltViewModel с @Inject перед конструктором.

Что касается утечки из-за Context, просто удалите ее из конструктора ViewModel и передайте Context как параметр метода ваших функций, например:

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

    fun getImages(@ApplicationContext context: Context) {
        /* ... */
    }
}
person Dario Brux    schedule 12.03.2021
comment
Правильно ли передать его в параметре метода? - person Abhishek AN; 15.03.2021
comment
Я думаю, что это не лучшая практика MVVM+Repository with Hilt с Context. Может быть, есть другие способы использовать его лучше, а может и нет, я, честно говоря, не знаю. Но, если подумать, используя Context таким образом, вы избежите всех утечек памяти из-за Context, потому что всегда ссылка на Context уничтожается после завершения метода и запуска GC. - person Dario Brux; 15.03.2021
comment
Хорошо, спасибо! - person Abhishek AN; 15.03.2021