Generalidades

Cree una tabla inferior universal independiente en Android | por Aditya | DSC KIET | junio de 2021

Antes de comenzar, espero que esté familiarizado con los siguientes conceptos / bibliotecas:

Si ha usado Dagger antes, sabrá que Dagger proporciona algunas de sus propias clases, y podemos extender estas clases para crear nuestras propias clases.Por nombrar algunos, normalmente partimos de DaggerAppCompatActivity Y el fragmento proviene de DaggerFragment. Si explora un poco más, encontrará que no hay «DaggerBottomSheet«, podemos ampliar nuestras propias hojas inferiores a partir de él.

Entonces, ¿por qué no crear uno para nosotros? La idea central detrás del desarrollo de dicha Hoja Inferior es crear una Hoja Inferior Base, que se convertirá en una clase abstracta en la que inyectaremos nuestro ViewModel. 😉

Antes de entrar en el contenido principal, déjame mostrarte lo que ya existe en nuestra base de código:

  • Una especie BaseApplication Clases que amplían DaggerApplication
  • Uno AppComponent La clase es el núcleo del paquete DI.

Los siguientes módulos forman parte de nuestro paquete DI.usamos @Component Enlazar estos a AppComponent clase.

  • AppModule (Vinculando el contexto de mi aplicación)
  • ActivityBindingModule (Vinculando todas las clases de actividad para mi aplicación)
  • ViewModelModule (Vincular todos los ViewModels de mi aplicación)
  • RepositoryModule (Vincular todos los repositorios de mi aplicación)
  • AndroidInjectionModule Y AndroidSupportInjectionModule Incluya enlaces para asegurar la disponibilidad de las clases del framework Dagger en nuestro proyecto.

El fragmento de código anterior muestra nuestra estructura AppComponent.java clase.

Vamos a sumergirnos ahora en el contenido principal 🙂

Primero, primero creemos un repositorio vacío. Siempre que tengo que crear un repositorio, prefiero crear una interfaz y luego implementarla en una clase separada para mantener la abstracción de la capa de datos en mi proyecto.

El siguiente paso es crear un ViewModel para nuestro BottomSheet y usar la inyección del constructor para inyectar nuestro Repositorio en nuestro ViewModel.

👉Para aquellos que no obtienen @Inject Aquí, nuestro BottomSheetRepository se nos «proporciona» porque creamos su instancia Non-Nullable en el módulo de repositorio.

¡Ahora es el momento de desarrollar nuestra propia mesa inferior como prometimos! Como se mencionó anteriormente, comenzaremos creando una clase abstracta, de modo que cada vez que tengamos que crear una nueva hoja inferior, solo necesitemos extender esta clase.

Ahora repasemos este fragmento de código paso a paso. 😮

Esperamos que esté de acuerdo en que la tabla inferior es solo un fragmento.Si parece que no está de acuerdo, intente pasar por el árbol de herencia BottomSheetDialogFragment (Se extiende AppCompatDialogFragment Seguido por un DialogFragment el último Fragment). Esto es lo que me permitió desarrollar el código que se muestra arriba.Si intentas ejecutar DaggerFragment , Encontrará un código muy similar al código que se muestra en el fragmento de código anterior.

¡Sí lo es! Aquí estamos. ¿Que pasó aquí?

  • Extendemos nuestra clase abstracta BottomSheetDialogFragment Y use HasAndroidInjector ¡interfaz!
  • Esto @Inject DispatchingAndroidInjector Realice la inyección de miembros de tipos de diseño básicos en nuestra aplicación (actividades y fragmentos).
  • Este tipo de objeto devuelve un AndroidInjector Usado para inject() Método en AndroidSupportInjection clase.
  • Finalmente, cuando usamos esta clase para comenzar nuestra hoja inferior, usamos static inject() Método de AndroidSupportInjection En nuestra clase onAttach() Dile a la daga el camino, ¡eh!Yo te proporcionaré AndroidInjector Objeto, deja que otras clases me inyecten (esto: contexto).

Además, pasamos un tipo V genérico, que extiende ViewModel al parámetro de tipo de nuestra Hoja Inferior Base. Usándolo, podemos inyectar cualquier ViewModel que necesitemos. Ahora, siempre que usemos esta clase para crear una nueva tabla inferior, getViewModel() El método se anula en nuestra subclase, que se usa para proporcionar la instancia de ViewModel que queremos usar con la tabla inferior.

¡Así es como usamos dagger para crear nuestro propio DaggerBottomSheet todo! Acerquémonos ahora a nuestro objetivo: hacer que nuestra mesa inferior sea lo más versátil posible.

Ahora es posible que necesitemos negativos de diferentes alturas. En algunos casos, solo necesitamos el diseño para empaquetar cualquier contenido que exista en el interior, pero en otros casos, es posible que también necesitemos que la parte superior de la hoja inferior toque la parte superior de la pantalla del dispositivo (podemos llamarlo fondo de altura completa hoja)) mismo). Por lo tanto, para lograr esta diferencia, primero creamos una función de utilidad que se puede usar para establecer esta altura según sea necesario.

Para darle una «punta del iceberg» del fragmento anterior, solo intentamos usar LayoutPrams (Establecer la altura de la página inferior), DisplayMetrics (Uno de sus métodos devuelve la altura de la pantalla del dispositivo físico que está utilizando) y BottomSheetBehaviour, Lo usamos para establecer el estado de la hoja inferior.

A continuación, usamos esta función de utilidad para modificar nuestra DaggerBottomSheet para que sea fácil establecer la altura de cualquier hoja inferior secundaria que creemos.

Aquí, reescribimos el método. onCreateDialog() De DialogFragment Clase, crea una instancia BottomSheetDialog Class y vincularlo a setupFullHeight() El método que creamos en la clase Utils. fullHeightFlag es un valor booleano, siempre de onAttach() El método de la hoja inferior secundaria que creamos.

Intenta adivinar si partimos de onCreateView() o onViewCreated() ¡método! !

Resultados finales: Si usted es setUpFullHeightBottomSheet() Método, nuestra hoja inferior se eleva a la altura mínima obtenida utilizando el ‘diseñowrap_content‘. De lo contrario, independientemente de la altura real del diseño, nuestra hoja inferior se elevará a la parte superior de la pantalla.

Ahora veamos cómo se ve una nueva hoja inferior secundaria creada usando Base con configuraciones típicas de enlace de datos.

Todo se ve bien, ¿verdad? ¡No! 😛 El principal problema que enfrentaremos en la hoja inferior independiente es la transmisión de datos. ¿Cómo envía y recibe datos en esta hoja de trabajo inferior? Si está adjunto a una actividad o fragmento (como solemos hacer), ya está vinculado a un ViewModel, por lo que las operaciones de transferencia de datos serán pan comido.

Por lo tanto, para obtener una solución funcional en la que pueda enviar y recibir datos fácilmente en la hoja de trabajo inferior, usaremos una biblioteca externa comúnmente llamada EventBus.

Un EventBus es como un bus interno, escucha eventos y transmite datos a destinos que se han suscrito a este bus. Según la documentación oficial,

Bus de eventos Es una biblioteca de código abierto para Android y Java, que usa Editor / suscriptor Modo débilmente acoplado. EventBus requiere solo unas pocas líneas de código para lograr una comunicación centralizada con clases desacopladas, lo que simplifica el código, elimina dependencias y acelera el desarrollo de aplicaciones.

Entonces, veamos ahora cómo integrar el bus de eventos en nuestra aplicación para simplificar la operación de transferencia de datos de nuestra hoja inferior.

Primero, agregue las siguientes dependencias a su archivo Gradle de nivel de aplicación, luego Gradle Sync (tenga en cuenta que en el momento de escribir este artículo, EventBus está en v3.2.0):

Ahora hay dos situaciones principales:

  • Tiene un fragmento / actividad de origen desde el cual comienza la hoja inferior para enviar datos.
  • Tiene un fragmento / actividad de destino y desea devolver algunos datos de la hoja inferior.

Los métodos en estos dos casos son casi los mismos, pero el primer caso es ligeramente diferente. 😉

Analicemos primero la primera parte.Para empezar, vaya a DaggerBottomSheet Lo hemos desarrollado antes y en tu DaggerBottomSheet clase:

Aquí, primero creamos un método genérico setDataOnEventBus(T t) Se utiliza para configurar datos en nuestro EventBus. Dejamos que los parámetros de datos se pasen como tipos genéricos para que podamos usar el mismo método en varias instancias, ya sea que solo queramos pasar un valor de cadena o toda la clase (o clase de modelo) como datos.

ahora en onStart() con onStop() Método, necesitamos registrarnos y darnos de baja de EventBus para que solo podamos acceder al bus durante el ciclo de vida de la hoja inferior.

A continuación, vamos a MyBottomSheet Desarrollamos y agregamos un método de suscripción a EventBus para que cada vez que coloquemos algunos datos en el bus, podamos recibirlos a través de este método.Para hacer esto, agregamos las siguientes líneas de código a nuestro MyBottomSheet clase:

Aquí creamos un método onMessageEvent() Recibimos los datos en nuestra hoja de trabajo inferior.También creé un MutableLiveData El objeto está en nuestro ViewModel, como se muestra en la línea 9 del fragmento de código anterior, para que podamos establecer el valor cuando lo recibamos.

Así que ahora, casi hemos terminado de configurar EventBus para obtener los datos en la hoja de trabajo inferior. ¡Ahora lo único que tenemos que hacer es enviar los datos! Hacemos esto escribiendo las siguientes líneas de código desde el fragmento / actividad de origen:

Si ha estado leyendo durante tanto tiempo, debe estar familiarizado con las primeras 3 líneas de código 🙂 Ahora hablemos del resto.

Aquí usamos EventBus post() El método envía un objeto de tipo cadena a nuestra hoja de trabajo inferior.

Tenga en cuenta que llamamos a EventBus desde el controlador, no directamente. ¿Puedes adivinar por qué hacemos esto? 😏

Eso es, chicos. De esta forma, ahora podemos obtener los datos de la hoja de trabajo inferior desde donde queramos. Ahora hablemos rápidamente de lo contrario.

Cuando queremos enviar datos desde nuestro formulario inferior, podemos usar métodos genéricos setDataOnEventBus(T t) Estamos en nuestro DaggerBottomSheet Configure los datos en el bus de eventos.

Para responder a la pregunta anterior, usamos un controlador al enviar datos a la tabla inferior, porque si intentamos enviarlos directamente, en ese momento, nuestra tabla inferior no podría registrarse para escuchar el bus de eventos, por lo que perdido Los datos enviados. Lo agregamos al Handler y tenemos un retraso de 500 milisegundos para encubrir esta situación. 😃

Al enviar datos desde la hoja inferior, no es necesario utilizar un controlador, porque cuando se sobrescribe la hoja inferior, el ciclo de vida de la actividad principal no se destruirá.

También puede ir a Event Bus – Github para leer la documentación oficial de Event Bus y su flujo de trabajo.

¡Aqui estamos! Cerca del final de este artículo. Primero discutimos cómo usar el método de inyección de Dagger para crear una forma inferior genérica, y luego discutimos las operaciones de transferencia de datos usando el bus de eventos. Hasta donde yo sé, Event Bus es una de las mejores bibliotecas que he usado durante el desarrollo de aplicaciones nativas. Chicos, resumamos. Sigue codificando y conserva el deseo de conocimiento😋

¡Nos vemos hasta el próximo blog!

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba