Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Entorno de ejecución de Compose

Se trata de los componentes fundamentales del modelo de programación de Compose y de su administración de estados, así como del entorno de ejecución principal al cual se orienta el complemento de compilación de Compose.
Actualización más reciente Versión estable actual Próxima versión potencial Versión beta Versión Alfa
1 de octubre de 2020 - - - 1.0.0-alpha04

Estructura

Compose es una combinación de 7 ID de grupo de Maven en androidx. Cada grupo contiene un subconjunto de funcionalidades objetivo, cada uno con su propio conjunto de notas de la versión.

En esta tabla, se explican los grupos y vínculos correspondiente a cada conjunto de notas de la versión.

GrupoDescripción
compose.animationCrea animaciones en sus aplicaciones de Jetpack Compose para enriquecer la experiencia del usuario.
compose.compilerTransforma las funciones que admite @Composable y habilita las optimizaciones con un complemento de compilador de Kotlin.
compose.foundationEscribe aplicaciones de Jetpack Compose con componentes fundamentales listos para usar y extiende la base para compilar tus propias piezas de sistema de diseño.
compose.materialCompila las IU de Jetpack Compose con componentes de Material Design listos para usar. Este es el punto de entrada de nivel superior de Compose, diseñado para proporcionar componentes que coincidan con los descritos en www.material.io.
compose.runtimeSon los componentes básicos del modelo de programación de Compose y la administración de estados, y el entorno de ejecución principal para el cual se orienta el complemento de compilación de Compose.
compose.uiSon los componentes fundamentales de la IU de Compose necesarios para interactuar con el dispositivo, incluidos el diseño, el dibujo y la entrada.
uiFunciona con la biblioteca de Jetpack Compose.

Cómo declarar dependencias

Para agregar una dependencia en Compose, debes agregar el repositorio Maven de Google a tu proyecto. Consulta el repositorio Maven de Google para obtener más información.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

dependencies {
    implementation "androidx.compose.runtime:runtime:1.0.0-alpha03"
    implementation "androidx.compose.runtime:runtime-livedata:1.0.0-alpha03"
    implementation "androidx.compose.runtime:runtime-rxjava2:1.0.0-alpha03"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerVersion "1.4.0"
        kotlinCompilerExtensionVersion "1.0.0-alpha03"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"]
    }
}

Para obtener más información sobre las dependencias, consulta Cómo agregar dependencias de compilación.

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Avísanos si descubres nuevos errores o tienes ideas para mejorar esta biblioteca. Consulta los errores existentes en esta biblioteca antes de crear uno nuevo. Para agregar tu voto a un error existente, haz clic en el botón de la estrella.

Crea un error nuevo

Consulta la documentación sobre la Herramienta de seguimiento de errores para obtener más información.

Versión 1.0.0

Versión 1.0.0-alpha04

1 de octubre de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:1.0.0-alpha04. La versión 1.0.0-alpha04 contiene estas confirmaciones.

Cambios en la API

  • Se agregó OwnerScope para permitir la recopilación de alcances de observación de diseños y dibujos cuando ya no son válidos. (Ic4cf8)
  • Se agregó la API de derivedStateOf para crear objetos State basados en un cálculo que puede leer otros objetos State (y derivar de ellos). (If758b)
  • Se agregó la API de TestOnly para SnapshotStateObserver. (I6e2a9)

Correcciones de errores

  • foundation.Box dejó de estar disponible. Usa foundation.layout.Box en su lugar. (Ie5950, b/167680279)

Versión 1.0.0-alpha03

16 de septiembre de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:1.0.0-alpha03. La versión 1.0.0-alpha03 contiene estas confirmaciones.

Cambios en la API

  • CompositionCoroutineScope ya no implementa MonotonicFrameClock. Los llamadores de withFrameNanos deben importar la función de nivel superior de manera explícita. (Icb642, b/166778123)

Correcciones de errores

  • Las funciones de prueba globales, como onNode o waitForIdle, dejaron de estar disponibles. Migra a sus equivalentes nuevas que se definen en ComposeTestRule. (I7f45a)
  • launchInComposition ya no inicia corrutinas sin enviar. (Ief6af, b/16648000)

Versión 1.0.0-alpha02

2 de septiembre de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:1.0.0-alpha02. La versión 1.0.0-alpha02 contiene estas confirmaciones.

Cambios en la API

  • Agrega las API de snapshotFlow y withMutableSnapshot para consumir y producir cambios de datos de Snapshot. (I3e722)
  • La convención de llamada para funciones que admiten composición cambió. Este es un cambio rotundo del objeto binario. Se deben volver a compilar todas las bibliotecas para que funcionen con esta versión del complemento del compilador de Compose.

    Esta modificación no crea un cambio rotundo a nivel de la fuente, ya que las únicas API que cambiaron son las API del compilador que tienen una participación explícita. (I7afd2, b/158123185)

  • Se quitaron métodos de programación de EmbeddingContext (I7b9be)

  • onPreCommit dejó de estar disponible. onCommit ahora tiene el comportamiento de onPrecommit.

    OnCommit y OnActive ahora se ejecutan en el mismo fotograma Choreographer que los cambios de composición incluidos, y no al inicio del siguiente fotograma Coreographer. (I70403)

Versión 1.0.0-alpha01

26 de agosto de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:1.0.0-alpha01. La versión 1.0.0-alpha01 contiene estas confirmaciones.

Versión 0.1.0-dev

Versión 0.1.0-dev17

19 de agosto de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:0.1.0-dev17. La versión 0.1.0-dev17 contiene estas confirmaciones.

Cambios en la API

  • Las emisiones personalizadas ahora pueden declarar que uno o más de sus métodos set pueden omitirse y reescribirse de forma independiente de la emisión. (Ibbd13)
  • Se quitaron las llamadas a FrameManager obsoletas.

    Se modificaron las API de composición interna a fin de reducir la sobrecarga para realizar el seguimiento de los objetos de estado, como mutableStateof(). (I80ba6)

  • El elemento state { ... } que admite composición dejó de estar disponible en favor de cualquier llamada explícita a remember { mutableStateOf(...) } por motivos de claridad. De esta forma, se reduce la plataforma general de la API, así como la cantidad de conceptos para la administración de estados, y se hace coincidir el patrón by mutableStateOf() con la delegación de propiedades de clase. (Ia5727)

  • Flow.collectAsState ahora determina el despachador predeterminado de la composición en lugar de recurrir a Dispatchers.Main de manera predeterminada. (I9c1d9)

  • Se corrigió la falla que ocurría cuando se utilizaba dentro del bucle algo que guardaba el estado. Ahora se permite tener la misma clave en savedInstanceState(), y ya se ajustó la API de UiSavedStateRegistry en virtud de este requisito nuevo. (I4ab76, (b/160042650)., b/156853976, b/159026663, b/154920561)

Correcciones de errores

  • El objeto emitView dejó de estar disponible. En su lugar, si fuera posible, usa AndroidView para emitir objetos View dentro de Compose. Ten en cuenta que en el futuro no se admitirá la composición directa de objetos View y ViewGroup, a menos que estos sean hojas en el árbol de la composición. En ese caso, esto se logra mediante AndroidView. (I29b1e, b/163871221)

Versión 0.1.0-dev16

5 de agosto de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:0.1.0-dev16. La versión 0.1.0-dev16 contiene estas confirmaciones.

Cambios en la API

  • La política predeterminada de mutación de mutableStateOf(), ambientOf() y savedInstanceStateOf() cambió a structuralEqualityPolicy(), en lugar de referentialEqualityPolicy().

    La configuración predeterminada para decidir si un valor nuevo asignado a una instancia mutableStateOf() se considera un cambio ahora es usar == en lugar de ===.

    Consulta https://kotlinlang.org/docs/reference/equality.html

    ambientOf() y savedInstanceStateOf() usan mutableStateOf() en sus implementaciones, por lo que se modificaron para ser coherentes con mutableStateOf().

    La igualdad estructural cumple en mayor medida con las expectativas de los desarrolladores.

    Por ejemplo:

    val state = mutableStateOf(1f)
    

    seguido de

    state.value = 1f
    

    ya no se considerará un cambio en state, y ya no se deberán reescribir los usos de state durante la composición.

    Este es un cambio rotundo, pero en la mayoría de los casos (como cuando se usan clases que no anulan equals()), no tendrá un efecto evidente en una aplicación.

    Para las clases que sí anulan equals(), como las clases data, podría observarse una degradación del rendimiento, ya que sus métodos equals() ahora se llamarán, de forma predeterminada, cuando se asignen a un mutableStateOf().

    Se puede restablecer el comportamiento anterior si agregas el parámetro de política policy = referentialEqualityPolicy() a las llamadas a mutableStateOf(), ambientOf() y savedInstanceStateOf(). (Ic21a7)

  • Row y Column ahora son funciones intercaladas, lo que reduce en forma significativa la sobrecarga asociada a su uso. (I75c10)

Correcciones de errores

  • SetViewContent dejó de estar disponible. En su lugar, usa setContent. (I7e497, b/160335130)
  • Se agregó MonotonicFrameAnimationClock, que te permite usar un MonotonicFrameClock como un AnimationClockObservable para cerrar la brecha entre los nuevos relojes basados en corrutinas y las API que aún usan los relojes antiguos basados en la devolución de llamada.

    El equivalente MonotonicFrameClock de ManualAnimationClock ahora es ManualFrameClock. (I111c7, b/161247083)

  • Se rediseñó por completo Modifier.stateDraggable, y se cambió su nombre por Modifier.swipeable. Se agregó una nueva clase SwipeableState, y se refactorizaron DrawerState y BottomDrawerState para heredar de ella. [Modal/Bottom]DrawerLayout ya no toma un parámetro onStateChange. (I72332, b/148023068)

  • Modifier.plus dejó de estar disponible; en su lugar, usa Modifier.then. "Then" tiene un indicador de orden más fuerte y, al mismo tiempo, prohíbe la escritura de Modifier.padding().background() + anotherModifier, lo que interrumpe la cadena y es más difícil de leer. (Iedd58, b/161529964)

  • Se agregó SubcomposeLayout. Se trata de un elemento primitivo de bajo nivel que permite componer los elementos secundarios durante la medición si queremos usar algunos valores disponibles más adelante durante la medición de la composición del subárbol. Por ejemplo, WithConstraints no se implementa mediante SubcomposeLayout. (I25cc8)

  • Se cambió el nombre de FilledTextField de Material por TextField, y el del TextField principal se cambió por BaseTextField a fin de que la API deseada resulte más fácil de encontrar y usar. (Ia6242, b/155482676)

  • Se cambió el nombre de Modifier.drawBackground por Modifier.background. (I13677)

Versión 0.1.0-dev15

22 de julio de 2020

Lanzamiento de androidx.compose.runtime:runtime-*:0.1.0-dev15. La versión 0.1.0-dev15 contiene estas confirmaciones.

Actualización de dependencias

  • Para usar la versión 0.1.0-dev15 de Compose, deberás actualizar tus dependencias de acuerdo con los nuevos fragmentos de código que se muestran más arriba en Cómo declarar dependencias.

Cambios en la API

  • La anotación del objeto @Model quedó obsoleta. Usa state y mutableStateOf como alternativas. Se decidió darle de baja después de un debate minucioso.

    Justificación

    Los motivos, entre otros, son los siguientes:

    • Reduce la superficie de la API y los conceptos que debemos enseñar.
    • Se alinea, de manera más estrecha, con otros kits de herramientas comparables (SwiftUI, React, Flutter).
    • Se puede revertir la decisión. Siempre podemos recuperar el elemento @Model en el futuro.
    • Quita el uso de caso límite y la dificultad para responder preguntas sobre la configuración del elemento @Model como cuestiones que necesitamos controlar.
    • Clases de datos, equals, hashcode del objeto @Model, etc.
    • ¿Cómo se pueden "observar" algunas propiedades y otras no?
    • ¿Cómo especifico la igualdad estructural frente a la igualdad referencial para usarla en la observación?
    • Reduce la característica "automática" del sistema. Disminuiría la probabilidad de que alguien suponga que el sistema es más inteligente de lo que es (es decir, que sabe cómo diferenciar una lista).
    • Permite que el nivel de detalle en la observación sea más intuitivo.
    • Mejora la refactorización de la variable -> propiedad sobre clase.
    • Es posible que ofrezca posibilidades para realizar optimizaciones manuales y específicas del objeto State.
    • Se alinea, de manera más estrecha, con el resto del ecosistema y reduce la ambigüedad hacia el estado inmutable o el "estado mutable que adoptamos".

    Notas de migración

    Casi todos los usos existentes del objeto @Model se transforman, de manera bastante trivial, de una de dos maneras. A modo de ejemplo, la siguiente clase del objeto @Model cuenta con dos propiedades y se usa en un elemento que admite composición.

    @Model class Position(
     var x: Int,
     var y: Int
    )
    
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    Alternativa 1: Usa el objeto State<OriginalClass>y crea copias.

    Este enfoque es más fácil con las clases de datos de Kotlin. En esencia, convierte todas las propiedades anteriores del objeto var en propiedades del elemento val de una clase de datos, luego usa el objeto state en lugar del elemento remember y asigna el valor state a las copias clonadas de la clase original mediante el método de conveniencia del elemento copy(...) de la clase datos.

    Es importante tener en cuenta que este enfoque solo funciona cuando las únicas transformaciones de esa clase se realizan en el mismo alcance que se crea la instancia State. Si la clase está mutando de manera interna fuera del alcance del uso y confías en esa observación, querrás usar el siguiente enfoque.

    data class Position(
     val x: Int,
     val y: Int
    )
    
    @Composable fun Example() {
     var p by state { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p = p.copy(x=it) }
       onYChange={ p = p.copy(y=it) }
     )
    }
    

    Alternativa 2: usa mutableStateOf y los delegados de propiedad.

    Este enfoque es más fácil con los delegados de propiedad de Kotlin y la API del objeto mutableStateOf, que te permite crear instancias MutableState fuera de la composición. En esencia, reemplaza todas las propiedades del objeto var de la clase original con las propiedades del elemento var con el objeto mutableStateOf como su delegado de propiedad. Esto tiene la ventaja de que el uso de la clase no cambiará en absoluto, solo su implementación interna. Sin embargo, el comportamiento no es completamente idéntico al del ejemplo original, ya que cada propiedad se observa o se suscribe de forma individual, por lo que las recomposiciones que observas después de esta refactorización pueden ser más limitadas (lo cual es bueno).

    class Position(x: Int, y: Int) {
     var x by mutableStateOf(x)
     var y by mutableStateOf(y)
    }
    
    // source of Example is identical to original
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    (I409e8, b/152050010, b/146362815, b/146342522, b/143413369, b/135715219, b/143263925, b/139653744)

  • Cambia la estrategia para la generación de código del compilador de Compose. Antes del cambio, el compilador de compose transformaba las llamadas en funciones que admiten composición. Con este cambio, ahora transformamos el cuerpo de este tipo de función sin modificar (en su mayor parte) el sitio de llamada.

    Esto significa que la mayor parte de la lógica que se comunica con el tiempo de ejecución de compose sucede al comienzo del cuerpo de la función, en lugar de ocurrir en el sitio de llamada.

    Este cambio debería ser compatible con código fuente para cualquier uso de compose. La mayoría de los usuarios de compose no deberían tener que actualizar ningún código como resultado de este cambio.

    A fin de brindar compatibilidad con este trabajo, se ha modificado la firma de JVM de todas las funciones que admiten composición. Una función que admite composición y que acepta un solo parámetro se transforma en una función que acepta tres parámetros. Los parámetros adicionales son Composer, un objeto integer. "clave", que es un valor entero de máscara de bits que se utiliza para propagar metadatos a través de llamadas.

    Ahora, Compose también transforma los argumentos predeterminados en una función que admite composición. Lo hace sin introducir una sobrecarga sintética, adicional y predeterminada de la función. Como resultado, este cambio tendrá menos funciones que se definan.

    Como consecuencia, se realizarán los siguientes cambios de comportamiento intencionales conocidos:

    1. Algunas llamadas se omitirán en los casos en que antes no hubiese ocurrido.
    2. Ahora, se suscriben y se administran correctamente las expresiones que admiten composición en las expresiones de argumento predeterminados.

    En este trabajo, se incluyeron algunas optimizaciones: 1. El resultado de las comparaciones de parámetros se propaga a otras funciones que admiten composición mediante el gráfico de llamadas. Como resultado, se realizarán menos comparaciones en el tiempo de ejecución, se reducirá el tamaño de la tabla de ranuras y se omitirán más funciones que admiten composición que antes no se omitían. 2. Los parámetros que se determinan "estáticos" en el tiempo de compilación ya no se comparan ni se almacenan en el tiempo de ejecución. Esto reduce la cantidad de comparaciones y el tamaño de la tabla de ranuras. 3. Se utiliza la estructura para el flujo de control del cuerpo de las funciones a fin de minimizar la cantidad de grupos que se generan. Esto reduce el tamaño de la tabla de ranuras y da como resultado menos trabajo para el tiempo de ejecución. 4. Si los parámetros de envío y recepción para las funciones no se utilizan dentro del cuerpo de la función, no se los incluye para determinar si se puede omitir la función.

    La mayoría de los cambios rotundos se realizaron en las API a las que el compilador se orienta de manera directa, y el uso típico de Compose no se verá afectado: 1. Se quitó el objeto Composer::startExpr. 2. Se quitó el objeto Composer::endExpr. 3. Composer::call quedó obsoleto. 4. Se quitaron las sobrecargas del objeto key que no son varargs. Usa la versión vararg en el futuro. 5. La anotación Pivotal quedó obsoleta. Usa el objeto key como reemplazo. 6. Se cambió el objeto ScopeUpdateScope::updateScope para esperar un elemento Function3 en lugar de Function1. 7. Se actualizaron los objetos restartableFunction y restartableFunctionN para que incluyan parámetros adicionales de tiempo de compilación. (I60756, b/143464846)

  • Se agregaron sortWith y removeRange a MutableVector. (Icccf7)

  • Se agregaron implementaciones de métodos de configuración predeterminada para CompositionLifecycleObserver. (I24289)

  • El aplicador ahora requiere un método clear() para desechar las composiciones. (Ibe697)

  • Se agregó asMutableList() a MutableVector para permitir que se pase a la API pública sin tener que copiar la lista completa. (I298df)

  • Se agregó el elemento rememberCoroutineScope() para obtener un CoroutineScope administrado en la composición a fin de iniciar trabajos en respuesta a eventos. (I0e264)

  • MutableVector es una colección nueva que no implementa ninguna de las interfaces estándar de la colección. Esta colección ofrece velocidad por sobre otros requisitos y está diseñada para usarse solo en implementaciones internas. (I8ebd6)

  • Se quitó temporalmente StableMutableList y StableMutableMap para evitar un error en la versión de Kotlin que Compose requiere. Estas interfaces volverán a introducirse una vez que Compose se haya actualizado a una versión de Kotlin que no presente este error.

    SnapshotStateList y SnapshotStateMap ahora son públicos, pero dejarán de estar disponibles cuando se restablezcan StableMutableList y StableMutableMap. (Ia7769)

  • agrega la función withFrameNanos de nivel superior para la sincronización de la animación. (Ie34c5)

  • La anotación @Untracked dejó de estar disponible. Reemplázala con @ComposableContract(tracked=false). (Id211e)

  • Se cambió el nombre de RestartableFunction y de las API asociadas por ComposableLambda, etc. El compilador solo modificó esas API, por lo que en general no debería afectar la compatibilidad a nivel de la fuente. El cambio de nombre se realizó, ante todo, para comunicar de una mejor manera qué es esta clase cuando aparece en seguimientos de pila. (I7eb25)

  • La anotación @Composable ya no es válida en las clases. (Ia5f02)

  • Ambient<T> ahora es @Stable en lugar de @Immutable. (I0b4bb)

  • Antes de este cambio, el complemento del compilador de Compose interceptaba de forma no trivial las llamadas a los constructores dentro de una función @Composable si había una (I5205a, b/158123804).

  • La función Recompose que admite composición ya no es una abstracción útil. La mayor parte de la recomposición debería ocurrir como resultado de las asignaciones de MutableState. Para todo lo demás, se recomienda usar la función invalidate a fin de activar una recomposición del alcance actual. (Ifc992)

  • Observe ya no es una abstracción útil. Si necesitas replicarla, su implementación se puede replicar con solo crear una función que admite composición que ejecute un parámetro lambda componible. Por ejemplo, @Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37)

  • @Direct quedó obsoleto y se lo reemplazó con @ComposableContract(restartable=false). (If4708)

  • Se agregó un adaptador para StateFlow que se introdujo hace poco y que permite completar previamente el valor inicial, de manera que el objeto State que se muestra no sea nulo (I61dd8, b/156233789)

  • Se agregó un adaptador para Flow. Ejemplo del uso: valor de flow.collectAsState() (If2198, b/153375923).

  • Los operadores delegados de la propiedad [Mutable]State se movieron a extensiones a fin de admitir optimizaciones delegadas de propiedad de Kotlin 1.4. Los emisores deben agregar importaciones para continuar usando by state { ... } o by mutableStateOf(...). (I5312c)

  • Se trasladó el objeto androidx.compose.ViewComposer al elemento androidx.ui.node.UiComposer androidx.compose. Se quitó el parámetro Emittable. Era redundante con el objeto ComponentNode. Se quitó el elemento androidx.compose.ViewAdapters. Ya no es un caso práctico admitido. Compose.composeInto quedó obsoleto. En su lugar, usa los elementos setContent o setViewContent. El componente Compose.disposeComposition dejó de estar disponible. En su lugar, usa el método dispose en el Composition que muestra setContent. Se movió androidx.compose.Compose.subcomposeInto a androidx.ui.core.subcomposeInto. Se cambió el nombre de ComponentNode#emitInsertAt a ComponentNode#insertAt, el de ComponentNode#emitRemoveAt a ComponentNode#removeAt y el de ComponentNode#emitMode a ComponentNode#move. (Idef00)

  • Se actualizó la marca ComposeFlags.COMPOSER_PARAM para que sea true, lo que cambiará la estrategia de generación de código para el complemento de composición. En un nivel alto, esto provoca que las funciones @Composable se generen con un parámetro sintético adicional, que se pasa a través de llamadas @Composable posteriores para que el entorno de ejecución administre la ejecución correctamente. Este es un cambio rotundo el objeto binario; sin embargo, debería preservar la compatibilidad a nivel de la fuente en todo uso sancionado de la composición. (I7971c)

  • Cambios rotundos en la API de ambients. Consulta la documentación de registro y de Ambient<T> para obtener más detalles. (I4c7ee, b/143769776)

  • Se agregó ui-livedata, un nuevo artefacto con un adaptador para LiveData. Ejemplo del uso: valor de liveData.observeAsState() (Ie9e8c, b/150465596).

  • Los adaptadores Rx sin valor inicial explícito quedaron obsoletos. El uso del valor nulo no siempre es la mejor configuración predeterminada: por ejemplo, cuando tienes una Lista, es mejor comenzar con emptyList() o con cualquier otro valor predeterminado razonable. (I00025, b/161348384)

  • Se agregó ui-rxjava2, un nuevo artefacto con adaptadores para RxJava2. Ejemplo del uso: valor de observable.subscribeAsState() (Ifab4b, b/153369097).

  • Ahora se puede usar savedInstanceState() con tipos anulables. (I6847f, b/153532190)

  • Se agregaron los nuevos elementos listSaver() y mapSaver() a fin de facilitar la escritura de objetos Saver personalizados. (I8cf68, b/152331508)

  • Nuevas funciones: savedInstanceState() y rememberSavedInstanceState(). Son similares a state() y remember(), pero tienen una compilación de compatibilidad de estado de instancias guardada. (If1987, b/152025209)

Correcciones de errores

  • Se cambió el nombre de runOnIdleCompose por runOnIdle. (I83607)
  • Se creó la API experimental LayoutNode. (I4f2e9)
  • androidx.ui.foundation.TextFieldValue y androidx.ui.input.EditorValue quedaron obsoletos. TextField, FilledTextField y CoreTextField que admiten composición y usan dicho tipo también quedaron obsoletos. En su lugar, usa androidx.ui.input.TextFieldValue. (I4066d, b/155211005)
  • Se quitó la API obsoleta del objeto DrawBackground y se reemplazó por las API de la extensión drawBackground en Modifier. Implementaciones refactorizadas de color, pincel y pintura del objeto drawBackground para reducir las rutas de código y quitar el requisito de crear Modifier como parte de la composición. (I0343a)
  • Se actualizaron las API de Compose de nivel superior que exponen un lienzo para mostrar el objeto CanvasScope en su lugar. Esto elimina la necesidad de que los consumidores mantengan sus propios objetos Paint. Para los consumidores que aún necesitan acceso a un lienzo, pueden usar el método de extensión drawCanvas que proporciona una devolución de llamada a fin de emitir comandos de dibujo con el lienzo subyacente. (I80afd)
  • Se modificó la API de WithConstraints con expresión lambda final. Ahora, en lugar de dos parámetros, tiene un alcance de receptor que, además de las restricciones y layoutDirection, brinda propiedades minWidth, maxWidth, minHeight y maxHeight en Dp. (I91b9a, b/149979702)
  • Se agregó un modificador de padding simétrico. (I39840)
  • Se actualizaron wrapContentWidth y wrapContentHeight para incluir Alignment vertical u horizontal en lugar de cualquier alineación. Se actualizó el modificador de gravedad para aceptar el elemento Alignment vertical u horizontal. Se actualizaron los objetos Row, Column y Stack para admitir el elementos Alignments continuos personalizados. (Ib0728)
  • Se cambió el nombre del módulo ui-text por ui-text-core. (I57dec)
  • Se mejoró la API de DrawModifier:
    • Se creó el alcance del receptor para draw() ContentDrawScope.
    • Se quitaron todos los parámetros de draw().
    • El objeto DrawScope tiene la misma interfaz que el elemento CanvasScope anterior.
    • ContentDrawScope tiene el método drawContent(). (Ibaced, b/152919067)
  • ColoredRect quedó obsoleto. Usa Box(Modifier.preferredSize(width, height).drawBackground(color)) en su lugar. (I499fa, b/152753731)
  • Se reemplazaron el modificador y el operador por funciones de extensión de fábrica (I225e4)
  • Ahora se puede acceder a los miembros RowScope y ColumnScope desde afuera de la fila y la columna. (I3a641)
  • Se cambió el nombre de LayoutFlexible por LayoutWeight. Se cambió el nombre del parámetro estricto para completar. (If4738)
  • WithConstraints tiene el parámetro LayoutDirection (I6d6f7)
  • Se cambió el nombre de background a DrawBackground y se lo estableció para memorizar de forma predeterminada. (Ia0bd3)
  • Se reemplazó ButtonStyle con funciones distintas y se quitó la sobrecarga de texto (string). Consulta muestras actualizadas para obtener información de uso. (If63ab, b/146478620, b/146482131)
  • Los objetos runOnIdleCompose y runOnUiThread ahora son funciones globales en lugar de ser métodos en ComposeTestRule. (Icbe8f)

Contribución externa

  • Se quitaron las API innecesarias como Looper y Handler de la capa de portabilidad del entorno de ejecución de Compose. (I6847d)
  • Elimina el elemento Flow<T>.collectAsState() sin valor inicial. Usa StateFlow<T> o pasa un valor inicial explícito (I63f98, b/157674865)