Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

428
Vistas
Ver la inicialización del modelo usando "by viewModels()" vs "ViewModelProvider(this).get(ViewModel::class.java)" en android

Podemos inicializar la clase ViewModel usando

 private val viewModel: CharactersViewModel by viewModels()

o

 viewModel = ViewModelProvider(this).get(CharactersViewModel::class.java)

Herer CharactersViewModel es nuestra clase ViewModel. Mi pregunta es ¿cuándo usar cuál? ¿Ambos contienen el mismo propósito? He leído la documentación oficial de Android de ViewModel. La documentación dice que el delegado de propiedad by viewModels() Kotlin . Pero lamentablemente no logró entenderlo. ¿Alguien puede ayudarme a entender esto?

over 4 years ago · Hanz Gallego
3 Respuestas
Responde la pregunta

0

Para agregar a las respuestas ya mencionadas,

El modificador lateinit le dice al verificador de tipos que una propiedad var se inicializará "por arte de magia" antes de que se use, por lo que no es necesario que se le proporcione un tipo anulable. Evita que el verificador de tipos lo ayude a inicializar las propiedades correctamente. En su lugar, los errores de programación en la inicialización se notifican mediante excepciones más adelante en el tiempo de ejecución.

Está diseñado para cuando el código Kotlin interactúa con los marcos Java heredados que usan la reflexión para insertar valores en los campos detrás del verificador de tipos y los modificadores de visibilidad.

Deberíamos tratar de evitar lateinit en nuestro código, si es posible, en este caso deberías usar

 private val viewModel: CharactersViewModel by viewModels()
over 4 years ago · Hanz Gallego Denunciar

0

Esas dos afirmaciones son iguales.

La palabra clave by Kotlin simplemente le ahorra un poco de código, le ahorra el dolor de usar la reflexión para acceder a su VM y se ve mucho más limpio, si es como yo.

Cualquiera o debería hacer el trabajo por ti :)

over 4 years ago · Hanz Gallego Denunciar

0

Ambos hacen lo mismo, pero hay una ventaja discriminatoria para el primero. La delegación de propiedades de Kotlin usa la idea de Lazy Initialization . En Wikipedia puedes encontrar una breve definición para ello:

En la programación de computadoras, la inicialización perezosa es la táctica de retrasar la creación de un objeto, el cálculo de un valor o algún otro proceso costoso hasta la primera vez que se necesita. Es un tipo de evaluación perezosa que se refiere específicamente a la creación de instancias de objetos u otros recursos.

Por lo tanto, cuando usa el primer enfoque que mencionó, aprovecha las propiedades perezosas. Significa que la instancia de ViewModel se crea solo en el primer acceso.

Dado el siguiente código como ejemplo:

 class YourFragment : Fragment() { private val viewModel: CharactersViewModel by viewModels() // other codes ... override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // doing some view initialization ... viewModel.someLiveData.observe(viewLifecycleOwner) { // ... } } }

Si viewModel.someLiveData.observe(viewLifecycleOwner) es la primera vez que se toca el campo viewModel , la creación de instancias ocurrirá allí. (creación de una instancia de CharactersViewModel )

Por lo tanto, el uso de la inicialización diferida de objetos como el modelo de vista reduce el impacto de inicio de su fragmento, lo que conduce a una carga más rápida y muestra su contenido en lugar de la inicialización directa de los mismos.

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda