Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android MVP open Actividad de Presenter, anti-pattern?

¿Sería un anti-patrón si de una capa de Presenter abro una Activity ?

Si es así, ¿debo administrar la navegación de la aplicación desde la capa de vista?

  • ¿Cómo inicio un servicio desde mi Interactor usando el patrón MVP en android?
  • MVP de Android con RxAndroid + Retrofit
  • Norma de arquitectura de Android MVP para cargar interfaz de usuario con clase Model que tiene recurso android
  • ¿El desarrollo de la interfaz de usuario de Android se presta bien a un patrón de diseño participativo?
  • MVP para Android: uso seguro Contexto en Presenter
  • ¿Dónde debería llamarse el servicio android y llamar a GoogleAPIClient mientras se utiliza el patrón MVP en android?
  • Inyección de genéricos en Dagger
  • Caché de datos del adaptador MVP
  • 3 Solutions collect form web for “Android MVP open Actividad de Presenter, anti-pattern?”

    Sí, es un patrón anti-mvp. Basado en la visión pasiva en MVP, usted perdió su testabilidad, porque usted no tiene que tratar con el marco androide en su presentador.

    Por lo tanto, es mejor administrar la navegación de la aplicación desde la capa de vista.

     class MyPresenter { MyPresenter.View view; void backButtonClicked() { view.navigateToHomeScreen(); } public interface View { void navigateToHomeScreen(); } } class MyActivity extends Activity implements MyPresenter.View { @Override void navigateToHomeScreen() { startActivity(...) } @OnClick(R.id.my_button) void onClick() { presenter.backButtonClicked(); } } 

    Otra ventaja de esta manera es que será fácil reemplazar la actividad con un fragmento o una vista.

    Editar 1:

    Morgwai dijo que de esta manera romperá la separación de la preocupación y la única responsabilidad, pero no puede tener una sola responsabilidad en todas partes . Alguna vez necesitas violarlo. Aquí hay un ejemplo de Google para MVP:

    TaskDetailPresenter llama a ShowEditTask que es responsable de abrir una nueva Activity dentro de TaskDetailFragment .

    Pero también puede utilizar CommandPattern, que es un mejor enfoque

     interface NavigationCommand { void navigate(); } 

    Así, Presenter lo usará cuando lo necesite.

    En mi opinión, sería mejor que abra una actividad desde la capa de vista. Prefiero que Presenter sepa lo menos posible sobre Actividad.

    Si hay alguna condición de qué actividad debe iniciarse, puede utilizar algo como esto:

     public class Presenter { private ViewsPresentation mViewsPresentation; public void someButtonClicked() { if (/*some condition*/) { mViewsPresentation.startFirstActivity(); } else { mViewsPresentation.startSecondActivity(); } } public interface ViewsPresentation { void startFirstActivity(); void startSecondActivity(); } } 

    Como escribí en mi comentario a la respuesta aceptada, creo que la gestión de la navegación desde la capa de vista es una clara ruptura de la separación de las preocupaciones de la regla: las vistas deben contener sólo los métodos para actualizar la pantalla de la interfaz de usuario actual.

    El problema se origina en el diseño de la plataforma android, ya que las clases Activity y Fragment contienen ambos métodos para operar en la interfaz de usuario y enviar objetos intencionales que inician otras actividades como startActivity .

    Una manera limpia de solucionar esto sería crear alguna interfaz de Navigator que contenga métodos relacionados con la navegación, hacer que las actividades lo implementen e inyectarlo en presentadores también. De esta manera, al menos desde la navegación de puntos de vista de los presentadores y la manipulación de interfaz de usuario estarían separados. Sin embargo, puede parecer extraño desde el punto de vista de las actividades: ahora a menudo implementan ambas interfaces (Navigator y View) y pasan su referencia 2 veces al presentador. Si por esta razón decide gestionar la navegación desde su capa de vista, al menos mantenga métodos para navegar por separado de aquellos para manipular la interfaz de usuario: nunca realice la navegación y la manipulación de la interfaz de usuario en el mismo método.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.