Introducción

1

Qué aprenderás sobre Clean Architecture en Android

2

¿Qué es clean architecture?

Repaso de Conceptos Generales

3

Principios SOLID

4

Repository Pattern

Presentación del proyecto

5

Presentación del proyecto: Rick and Morty

6

Uso de RxJava y RxAndroid en el proyecto

Capa de Presentación

7

Introducción a la capa de presentación

8

Implementación de la capa de presentación

9

Solución del reto

Capa de Casos de Uso

10

Introducción a la capa de casos de uso

11

Solución del reto: capa de casos de uso

Capa de Dominio

12

Introducción a la capa de dominio

13

Implementación de la capa de dominio: mappers

14

Migración entidades de framework a dominio

15

Solución del reto: capa de dominio

Capa de Datos

16

Introducción a la capa de datos

17

Implementación de la capa de datos: repositorio

18

Implementación de la capa de datos: fuente de datos

19

Solución del reto: capa de datos

Extras: Migración de Capa de Casos de Uso

20

Migración de la capa de casos de uso

Capa de Framework

21

Introducción a la capa de framework

22

Implementación de Image Manager (Glide)

23

Implementación de Database Manager (Room)

24

Implementación de Request Manager (Retrofit)

Inyección de Dependencias

25

Introducción a la inyección de dependencias

26

Implementación de Dagger (Módulos)

27

Implementación de Dagger (Componente)

28

Solución del reto: inyección de dependencias

Pruebas unitarias a nivel general

29

Implementación de pruebas unitarias (conceptos generales)

30

Pruebas unitarias en la capa de presentación

31

Pruebas unitarias en las capas de casos de uso y datos

Conclusiones

32

Cómo seguir mejorando la arquitectura

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Introducción a la capa de presentación

7/32
Recursos

Aportes 14

Preguntas 4

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Como comentario para el profesor , le sugiero que copie el estilo de Cristian Villamil en el curso de Patrones de diseño.
Es mejor explicar el tema, luego explicar como hacerlo en código de forma clara y siguiendo paso a paso la logica anteriormente explicada.
No es lo que Mauricio está haciendo, solamente dá una breve explicacion previa y luego te lee lo que está tipeando con poco seguimiento de la lógica global

Creo que debería de dar un contexto general de lo que esta haciendo y por que lo hace. No se logra entender casi nada de lo que esta haciendo.

Muy bueno el nivel de este curso, tengo varias dudas…
Qué ventaja tiene usar un sólo LiveData de eventos respecto a varios LiveData para cada uno, es decir, un LiveData para el error , otro para CharacterList otro para el loading. ?

La manera que explica el profesor o la metodología es muy complicada, he seguido toda la linea de Android pero lo que ya implementa y sin una explicación previa es muy complicado

Por si alguien tiene la duda. La clase Event sirve para evitar que un mismo evento sea consumido más de una vez. Tambien podríamos usar un AtomicBoolean para evitar problemas con multi threading. Además podrías crear un EventObserver para que no tengamos que utilizar getIfNotHandled() cada vez que observemos el livedata

data class Event<out T>(private val content: T)  {
    private var hasBeenHandled = AtomicBoolean(false)

    /**
     * Returns the content and prevents its use again.
     */
    fun getIfNotHandled(): T? = if (hasBeenHandled.getAndSet(true)) null else content

    /**
     * Returns the content, even if it's already been handled.
     */
    @Suppress("unused")
    fun peek(): T = content
}

class EventObserver<T>(private val onEventUnhandledContent: (T) -> Unit) : Observer<Event<T>> {
    override fun onChanged(event: Event<T>?) {
        event?.getIfNotHandled()?.let { value ->
            onEventUnhandledContent(value)
        }
    }
}```

Es bueno el contenido del curso, pero deberían sacar uno nuevo, actualizado al 2021 en donde se traten temas como Navigation component e incluso un poco de Jetpack Compose ahora que ya está en su versión estable

Entiendo que solo es refactorizacion y en algún punto la inyeccion de dependencias va a resolver la contruccion del ViewModel, pero la forma correcta es usar la extensionFunction

private val viewmodel by viewModels<ViewModelDeseado>()

Platzi hay que actualizar el curso para compose, inviertan en los cursos y no en los equipos de fútbol

Siempre querido hacer un curso en Platzi, y la verdad que hasta ahora estoy muy contento con cómo me siento con mi primero curso, creo que esto va a ser un acierto importante, si todo sigue igual considerare pagarlo para siempre, no quiero parar de prender y mejorar mis skills 😉 y Platzi parece que es lo que necesitaba.

Para renombrar una variable de una manera mas optica se puede usar el shortcut “shift+F6”

Esta clase esta muy compleja hay mas o menos entiendo que maneja algo de eventos pero deberias explicar tu manera de programar el ViewModel con el LiveData

Excelente clase, el profesor tiene nivel

Buena clase

Hola a todos. Tengo una duda respecto a los eventos de la clase CharacterListNavigation(). Cuando tú creas el evento “X por ejemplo” y al final pones : CharacterListNavigation() ¿Esto qué me indica, es un valor de retorno? Gracias por tu aclaración. Excelente curso!!