Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Implementando MVVM en una app Android

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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/