Saltar al contenido

¿Puedo registrar MVP Presenter dentro de Fragment?

Bienvenido a nuestra página, ahora vas a encontrar la resolución que estás buscando.

Solución:

Como puedes ver en De Google muestras (https://github.com/googlesamples/android-architecture), Activities crear Presenters. También Views adjuntar a Activity y Presenters obtener vistasFragments) como parámetro.

Después Fragment transacción comprometida o Fragment (ver) estado restaurado Presenters ser creado y tomar Fragments (vistas) como parámetro que llamar

view.setPresenter(T presenter); 

métodos de vistas y Presenters regístrese para ver.

Creo que creando Presenter en Fragment no es una buena práctica. Primero que nada son capas separadas. Esto es ilegal para Separación de intereses. Y segundo, si crea un presentador en Fragment, vincula la vida de su Presentador a la vista LifeCycle y cuando Fragment se destruye y se vuelve a crear, creas un nuevo presentador pero son capas diferentes.

El modelo es una interfaz que define los datos que se mostrarán o sobre los que se actuará en la interfaz de usuario.

El presentador actúa sobre el modelo y la vista. Recupera datos de repositorios (el modelo) y los formatea para mostrarlos en la vista.

La vista es una interfaz pasiva que muestra datos (el modelo) y enruta los comandos del usuario (eventos) al presentador para actuar sobre esos datos.

Entonces Activity puede actuar como un overall controller que crea el Presenters y Views y conectarlos.

ingrese la descripción de la imagen aquí

Si hablamos de tu pregunta, sí puedes registrar presentador en fragmento. Pero debe evitar crear presentadores en fragmentos que utilice como vista.

Pero hay muchos enfoques diferentes sobre el patrón MVP en la comunidad de Android, como a continuación. https://plus.google.com/communities/114285790907815804707

¿Por qué las actividades no son elementos de la interfaz de usuario? http://www.techyourchance.com/activities-android/

Si está utilizando una sola Actividad para alojar varios Fragmentos y también está utilizando Dagger 2 para inyectar el presentador que necesita, puede inyectar cada presentador a cada Fragmento directamente.

Mi caso de uso

Estoy haciendo un proyecto con arquitectura desde hace algunos meses desde que me enteré del componente de navegación jetpack de Android, comencé a migrar todas las vistas de mi aplicación a este patrón.

Entonces, me encontré con mucha refactorización al hacer el proceso y estaba en esta situación de no sé qué hacer con esta situación.

Como utilicé Dagger 2 desde el punto de inicio para inyectar a mis presentadores en mis Actividades, esto no cambiará mucho haciendo lo mismo pero con Fragmentos.

Me encontré con el mismo repositorio para verificar cómo se suponía que debía seguir la arquitectura con Fragments, que de hecho es una buena manera de crear una instancia del presentador dentro de la Actividad del host si solo tiene 1 Fragmento cuando era niño.

El caso es que si necesito tener varios Fragmentos dentro de una Actividad de host, debería hacer una instancia de cada presentador y pasarla a través de mi FragmentManager dentro de cada Fragmento y creo que no es lo que estaba viendo, ya que agrega múltiples instancias del presentador de la Actividad del anfitrión.

Esto lleva a un caso, tener varias instancias dentro de mi actividad de host para todos los presentadores, y también algunas interfaces para manejar la separación de trabajos / vistas si es necesario.

Una forma sencilla de hacerlo con varios fragmentos es simplemente no pensar en la actividad del anfitrión e inyectar a los presentadores dentro de cada fragmento.

Desde que hizo esto con Dagger, hace que la inyección sea más limpia.

Eche un vistazo a un ejemplo sencillo

class MainMenuActivity : BaseActivity()

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        inflateMainFragment(savedInstanceState)
    

      override fun getLayout(): Int 
        return R.layout.activity_main_menu
    

    fun inflateMainFragment(savedInstanceState: Bundle?)
        if (savedInstanceState == null) 
            val fragment = MainMenuFragment()
            supportFragmentManager
                .beginTransaction()
                .add(R.id.nav_host_fragment, fragment)
                .commit()
        
    

Como puede ver, aquí no tengo ninguna instanciación de los presentadores que toda mi navegación debería necesitar. En cambio, solo inyecto cada presentador que necesito dentro de cada Fragmento

class MapsFragment: BaseMapFragment(), MapContract.MapView 

    private lateinit var mMap: GoogleMap

    @Inject
    lateinit var presenter: MapsPresenter

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        return inflater.inflate(R.layout.fragment_paseo,container,false)
    

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)
        (requireActivity().application as YawpApplication).getAppComponent()?.inject(this)
        presenter.attachView(this)
        setupToolbar()
        setupMap()
    

Y haciendo uso del ciclo de vida de Fragmentos, puede separar todas sus vistas de Fragmentos en onDestroyView() y también ahorra algo de espacio en la memoria cuando se ejecuta el recolector de basura.

 override fun onDestroyView() 
        super.onDestroyView()
        presenter.detachView()
        presenter.detachJob()
    

En el repositorio oficial de Google encontré una pregunta que me ayudó a entenderlo mejor.

Puede comprobar aquí

Al final de todo puedes encontrar las crónicas de otros sys admins, tú de igual forma tienes la habilidad dejar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *