¿Es posible verificar si una función se ha ejecutado en modo de vista previa en Jetpack compose? Tengo una función que devuelve una cadena adecuada para usar en la aplicación, pero esta función usa algunos objetos que deshabilitan el modo de vista previa para los componentes @Composable . Lo que podría hacer es pasar val isPreview: Boolean = false flag a cada componente y luego ejecutar una función simplificada si el indicador es true , pero esto agrega un código repetitivo a cada componible.
No alojan (a partir de enero de 2022) el código @Preview Jetpack Compose en su MainActivity al obtener una vista previa de los elementos en Android Studio.
Esto significa que puede recorrer el árbol context.baseContext para determinar si está en la clase MainActivity de su aplicación o en la clase de actividad de nivel superior de otra aplicación. Mi actividad de nivel superior se llama MainActivity, entonces:
fun Context.findMainActivityOrNull(): MainActivity?{ var context = this while (context is ContextWrapper) { if (context is MainActivity) return context context = context.baseContext } return null }Esto hace que pueda evitar configurar el color de la barra de estado cuando esté en la vista previa, de esa manera no falla la vista previa al intentar hacer eso.
Llamas a la función anterior así:
context.findMainActivityOrNull() //when in a non-@Composable areaSi está en una función @Composable, entonces debería poder ir:
LocalContext.current.findMainActivityOrNull()Puede volverse elegante y envolver la clase que se comporta mal en un adaptador para estar limpio y ordenado al respecto, o simplemente verificar si el resultado de lo anterior es nulo cuando solucione algunos problemas.
Normalmente hago esto llamando a LocalInspectionMode.current para saber si estoy en modo de vista previa. Devuelve true si está en modo de vista previa.
Esto es lo que dice la documentación sobre LocalInspectionMode :
Modo inspeccionable ComposiciónLocal. True si la composición está compuesta dentro de un componente inspeccionable.
Esto violará el paradigma funcional de una función componible. Debe ser sin estado y no le importará si se ejecuta en modo de vista previa o en una aplicación real o, de lo contrario, encontrará errores inesperados en el futuro cuando la aplicación sea muy grande para administrar.
Debe intentar refactorizar o reestructurar su composición para que solo dependa de la cadena directamente como parámetro. El modo de vista previa puede enviar una cadena codificada para este componible, pero para su aplicación real, puede llamar a esa función que devuelve la cadena adecuada (que usa algunos objetos).
Más sobre "Pensar en Componer" aquí