Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Implementando MVVM en una app Android

Implementando MVVM en una app Android

De la necesidad de estructurar nuestro proyecto Android de forma que resulte lo más flexible y testeable posible, Google presentó Architecture Components, facilitando la implementación del patrón de arquitectura Model-View-ViewModel. Aprenderemos a implementarlo utilizando librerías de Jetpack y el lenguaje de programación Kotlin.

Avatar for Maribel Maisano

Maribel Maisano

September 09, 2020
Tweet

More Decks by Maribel Maisano

Other Decks in Programming

Transcript

  1. Agenda • ¿Por qué necesitamos patrones de arquitectura? • Evolución

    de los Patrones de Arquitectura en Android • MVVM en detalle • ¡Jetpack al rescate! • ¿Cómo lo hago? ‍ • Pasos siguientes
  2. MVVM - Componentes • Model: Entidades, DTOs. • View: Estructura

    de la UI. Capta las interacciones del usuario y observa el estado de la vista • ViewModel: Encargado de reaccionar ante cambios en el modelo, modificar y exponer el estado a la vista
  3. Ventajas • El ViewModel como single source of truth del

    estado de las vistas • Programación orientada a eventos • Mayor desacoplamiento • Facilidad para escribir unit tests
  4. Unit testing • Los componentes Model y ViewModel son independientes

    del framework de Android y de la UI, lo cual facilita la escritura de test unitarios. • Si se necesita acceso a alguna clase de Android, se puede escribir un wrapper de modo que se pueda continuar normalmente con las pruebas unitarias gracias al uso de mocks.
  5. Algunas consideraciones • MVVM no es una solución integral para

    todos los aspectos de una aplicación. Por ejemplo, no proporciona directivas para implementar el almacenamiento ni acceso a los datos de distintas fuentes como BBDD, red, etc. • No existe una única implementación. Para implementar la reactividad al momento de observar estados, puede hacerse uso de distintas librerías como RxJava, Flow, LiveData. • Hay implementaciones que hacen uso de databinding.
  6. Dependencias // ViewModel implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // LiveData implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" //

    Extensions (opcionales) implementation "androidx.activity:activity-ktx:$activity_ktx_version" implementation "androidx.fragment:fragment-ktx:$fragment_ktx_version"
  7. Creación del ViewModel class FileExplorerViewModel : ViewModel() { private val

    _pictures = MutableLiveData<List<Picture>>() val pictures: LiveData<List<Picture>> = _pictures fun loadFiles(contentResolver: ContentResolver) { _pictures.value = PicturesRepository.loadPictures(contentResolver) } }
  8. Obtención de un ViewModel private val viewModel: FileExplorerViewModel by viewModels()

    viewModel = ViewModelProvider(this).get(FileExplorerViewModel::class.java) ⬇
  9. ViewModelFactory: Definición class Factory(private val confidence: Float = 0.7F) :

    ViewModelProvider.NewInstanceFactory() { override fun <T : ViewModel?> create(modelClass: Class<T>): T = ImageDetailViewModel(confidence) as T }
  10. Enlaces útiles • Documentación oficial: Android Jetpack ViewModel https://developer.android.com/topic/libraries/architecture/viewmodel •

    Codelab: Android Kotlin Fundamentals: ViewModel https://codelabs.developers.google.com/codelabs/kotlin-android-training-view-model • Proyecto de ejemplo: https://github.com/maribelmai/wdw-mvvm/