Inyección asistida con mango de cuchillo (mango de cuchillo, parte 5) | Autor: Tanya Arora | Julio de 2021

Supongamos que tenemos una clase con 3 parámetros, Hilt sabe cómo inyectar dos de ellos, pero el valor del tercer parámetro se determina en tiempo de ejecución.

En este caso, ¿cómo usaremos Hilt?
Hilt nos permite usar inyecciones asistidas para hacer esto. Usemos un ejemplo de la clase BlogUtil que requiere 3 parámetros para completarla, a saber: contexto, firebaseUtils y blogPost.
Paso 1: crea una clase con inyección asistida
class BlogUtil @AssistedInject constructor(@ActivityContext val context: Context,
firebaseUtils: FirebaseUtils, @Assisted
val blogPost: BlogPost
)
...
class FirebaseUtils @Inject constructor()
...
Aquí está la diferencia con la inyección ordinaria.
- usamos @AssistedInject En lugar de @Inject para inyección de constructor.
- Se utilizan los parámetros que deben proporcionarse en tiempo de ejecución @ayudar.
Paso 2: cree una fábrica para la clase creada en el Paso 1
Incluso después de tisegundo@AssistedInject, no podemos inyectar BlogUtil directamente en nuestro fragmento, primero necesitamos crear una fábrica.
@AssistedFactory
interface BlogUtilFactory fun create(blogPost: BlogPost): BlogUtil
Atención de nuestra fábrica
- Creamos una fábrica para nuestra clase como interfaz.
- Anote nuestra fábrica con @AssistedFactory. Esta anotación le dice al sistema que esta interfaz se usa para crear una instancia de una clase que necesita inyección auxiliar.
- Cree una diversión que devuelva una instancia de nuestra clase y acepte solo los parámetros proporcionados en tiempo de ejecución, lo que significa que los parámetros anotados como @Assisted en nuestra clase BlogUtils.
Paso 3: use nuestra clase en el componente
Ahora, cuando queramos usar la clase BlogUtil (fragmento en nuestro ejemplo) en nuestro componente, inyectaremos su fábrica en lugar de la clase en sí, y luego usaremos la fábrica para crear una instancia de la clase real.
@AndroidEntryPoint
class BlogFragment : BaseFragment@Inject
private var blogPost: BlogPost
lateinit var blogUtilFactory: blogUtilFactory
private lateinit var blogUtil: BlogUtil .... fun getBlogUtil()
blogUtil = blogUtilFactory.create(blogPost)
Cosas a las que prestar atención aquí
- Usamos inyección de campo para inyectar nuestro BlogUtilFactory
- Creamos una diversión, que usa BlogUtilFactory create fun para crear una instancia de la clase BlogUtil.
¡Mirar! ! ! Estamos muy felices de irnos. Ahora podemos usar blogUtils en fragmentos.
Ahora que sabemos qué es la inyección auxiliar y cómo utilizarla, veamos un ejemplo, Android nos obliga a utilizar la inyección auxiliar para inyectar el gestor de trabajo.
Paso 1: incluye dependencias
Para usar Hilt en WorkManager, primero debemos incluir una dependencia de trabajador de Hilt y un procesador de anotaciones que funcione sobre el procesador de anotaciones de Hilt.
dependencies implementation("androidx.hilt:hilt-work:1.0.0")
// When using Kotlin.
kapt("androidx.hilt:hilt-compiler:1.0.0")
// When using Java.
annotationProcessor("androidx.hilt:hilt-compiler:1.0.0")
Paso 2: use la inyección auxiliar en la clase Worker
@HiltWorker
class NotificationWorker @AssistedInject constructor(@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
workerDependency: WorkerDependency
) : Worker(appContext, workerParams) ...
- Anotar la clase Worker con @HiltWorker
- Use @AssistedInject para la inyección del constructor
- El contexto y los parámetros de trabajador deben anotarse con @Assisted.
Nota: Solo podemos usar el enlace de alcance de la aplicación (enlace anotado con @Singleton) o el enlace sin alcance en el objeto Worker.
Paso 3: implementar la interfaz Configuration.Provider en la clase Application
@HiltAndroidApp
class MyApplication : Application(), Configuration.Provider @Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
Nota: Debido a que esto personaliza la configuración de WorkManager, debemos eliminar el inicializador predeterminado del archivo AndroidManifest.xml, como Documento de administrador de trabajoPara ello, debemos agregar el siguiente código en el archivo Manifest.
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="$applicationId.workmanager-init"
tools:node="remove" />
Eso es para este artículo. ¡Espero eso ayude! !