MVP de Android con Dagger 2 – Actividad con múltiples fragmentos

He estado buscando en los ejemplos de Google Android Architecture para MVP con Dagger 2:

Https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksActivity.java

Pero el ejemplo es algo trivial: cada actividad tiene sólo un fragmento y el componente de la daga se construye en la actividad y se utiliza para inyectar la actividad con el presentador del fragmento.

He intentado construir en ese ejemplo, para agregar múltiples fragmentos a una actividad y navegar entre ellos. Puesto que cada fragmento tiene su propio presentador, he movido el edificio de la pieza de la daga en el fragmento. Así que ahora tengo:

  • FragmentCallback (una interfaz que proporciona métodos para cargar fragmento1 y fragmento2)
  • Actividad (implementa FragmentCallback)
  • Fragmento1 (implementa la interfaz de vista)
  • Fragment1Contract (define interfaces de vista y presentador)
  • Fragment1Presenter (implementa la interfaz del presentador)
  • Fragmento1Componente (inyecta Fragmento1)
  • Fragment1Module (proporciona la vista y el presentador)
  • Fragmento2
  • Fragment2Contract (define interfaces de vista y presentador)
  • Fragment2Presenter (implementa la interfaz del presentador)
  • Fragment2Component (inyecta Fragment2)
  • Fragment2Module (proporciona la vista y el presentador)

La actividad hace muy poco, solo carga el primer fragmento e implementa FragmentCallback que la vista puede usar para cambiar a otro fragmento.

El primer fragmento tiene un botón que carga el segundo fragmento usando el FragmentCallback – que los fragmentos obtienen mediante el lanzamiento de la Actividad vía

public void onAttach(Context context) { super.onAttach(context); callback = (FragmentCallback) context; } 

¿Estoy en una pista sensible aquí? Mientras que el código parece limpio con MVP estoy perdiendo algo wrt los componentes de la daga y los módulos?

Gracias.

Actualizar

He mejorado un poco la situación al crear un componente y un módulo para la actividad. Cada Fragmento todavía construye el contexto de la Daga, pero ya no estoy inyectando la vista (fragmento) en el constructor del presentador – cuando el fragmento construye el contexto, se inyecta a sí mismo (por lo que tiene el presentador) entonces llama presenter.init(this) De modo que el presentador tiene ahora la vista.

Esto reduce muy bien el número de clases, y el siguiente paso sería probar sólo la construcción del componente en la actividad, y tener el fragmento usar esto para inyectarse (sin tener que construir un nuevo componente).

Definitivamente estás en el buen camino.

Sugiero que no utilice un solo componente en la Activity , pero instanciar un componente por separado Fragment (incluso si los componentes son los mismos). Este enfoque tiene dos ventajas:

  • Los fragmentos no están acoplados a la Activity ya otros Fragments por el propio componente (y los objetos que el componente podría almacenar en caché si utiliza los ámbitos)
  • Permite un empleo más graneado de los ámbitos (si es necesario)

Fuera de contexto:

Escribí una entrada en el blog sobre por qué las actividades en Android no son elementos de la interfaz de usuario . Echa un vistazo, y si sientes que tiene sentido, entonces hay un enlace a la implementación alternativa de MVP 🙂

  • Adaptador como presentador? ¿O hablar con un presentador? Android y MVP
  • Realm, RxJava, asObservable () y doOnUnsubscribe ()
  • MVP de Android: cómo comunicarse entre el presentador de la actividad y el presentador de fragmentos
  • Utilizar la programación con RxAndroid
  • ¿Cómo compartir datos entre dos presentadores en la arquitectura MVP en Android?
  • MVP de Android con RxAndroid + Retrofit
  • Explicación de Android MVP
  • Prueba instrumental de una vista en MVP
  • MVP para Android: ¿Qué es un Interactor?
  • MVP de Android: ¿debe ser una actividad una vista o un presentador?
  • Múltiples Actividades / Fragmentos y el Model View Presenter pattern
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.