Estoy usando Hilt para inyectar contexto y otras dependencias en mi clase HomeViewModel; Todo funciona correctamente, pero recibo esta advertencia. ¿Cómo puedo evitar las fugas?
Este es mi HomeFragment (donde inyecto y uso la clase HomeViewModel):
@AndroidEntryPoint class HomeFragment : Fragment() { private val viewModel: HomeViewModel by viewModels() .... }Esta es la advertencia:
class HomeViewModel @ViewModelInject constructor( @ApplicationContext val context: Context, private val locationAPI: LocationAPI, private val imagesAPI: ImagesAPI ) : ViewModel() { ... }Estoy usando:
//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"¡Gracias!
- Editado, como se sugiere, después de la primera respuesta dada:
El fragmento de inicio ahora es:
@HiltViewModel class DetailsViewModel @Inject constructor( @ApplicationContext val context: Context, private val locationDetailsAPI: LocationAPI) : ViewModel() { ... }Dependencias actualizadas a:
//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"Y sigo recibiendo este error de fuga.
¿Alguna idea?
Después de enfrentar esa advertencia
Decidí perfilar la memoria para garantizar que el enfoque provoque una pérdida de memoria, pero lo que encontré es bastante interesante.
sí, no hay fugas , es solo una advertencia, así que no te preocupes más, feliz codificación;)
¿La versión de su complemento Kotlin es 1.4.30-release-Studio4.1-1?
Si es así, baje la versión del complemento kotlin.
En la versión 1.4.30-release-Studio4.1-1,
si viewmodel tiene contexto como variable de instancia, genera una advertencia.
No recibo esta advertencia e inyecto un contexto de la misma manera.
Intenta actualizar a 2.31.2-alpha para hilt y 1.0.0-alpha03 para hilt-androidx
Hay algunos cambios importantes. Deberá anotar sus modelos de vista con @HiltViewModel, use @Inject en lugar de @ViewModelInject. Y deberá reemplazar cualquier referencia a ApplicationComponent con SingletonComponent.
Tuve el mismo problema después de actualizar las dependencias de Hilt.
Es correcto usar @HiltViewModel con @Inject antes del constructor.
Con respecto a la fuga debido al Contexto, simplemente elimínelo del constructor ViewModel y pase el Contexto como parámetro de método de sus funciones, así:
@HiltViewModel class HomeViewModel @Inject constructor( private val locationDetailsAPI: LocationAPI, private val imagesAPI: ImagesAPI ) : ViewModel() { fun getImages(context: Context) { // do something } }Inyecte la aplicación en su lugar:
@Inject constructor(private val application: Application)Entonces puedes obtener el contexto de esta manera:
application.applicationContext