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

Compose Material

Compila 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.
Actualización más reciente Versión estable actual Próxima versión potencial Versión beta Versión Alfa
16 de septiembre de 2020 - - - 1.0.0-alpha03

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
composeDefine tu IU de manera programática con funciones que admiten composición que describan su forma y sus dependencias de datos.
compose.animationCrea animaciones en sus aplicaciones de Jetpack Compose para enriquecer la experiencia del usuario.
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.material:material:1.0.0-alpha07"
}

android {
    buildFeatures {
        compose true
    }

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

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-alpha03

16 de septiembre de 2020

Lanzamiento de androidx.compose.material:material:1.0.0-alpha03, androidx.compose.material:material-icons-core:1.0.0-alpha03 y androidx.compose.material:material-icons-extended:1.0.0-alpha03. La versión 1.0.0-alpha03 contiene estas confirmaciones.

Cambios en la API

  • Se cambió el nombre del parámetro onSelect de BottomNavigationItem a onClick. (I91925, b/161809324)
  • Se agregó el parámetro InteractionState a BottomNavigationItem y Tab, lo que permite elevar este estado y ajustar la forma en que aparece el componente en diferentes estados. (Ia3e9e, b/168025711)
  • Se quitaron los parámetros disabledBackgroundColor y disabledContentColor de los botones. En su lugar, debes usar las nuevas funciones predeterminadas de color dentro de ButtonConstants. Si ya configuraste de forma explícita contentColor o backgroundColor, en su lugar, debes usar estas funciones predeterminadas y personalizar algunos o todos los parámetros para evitar que se reemplace el color de los estados habilitados o inhabilitados. (If9b52)
  • El color de fondo de Textfield ya no aplica la transparencia alfa de manera implícita. En su lugar, se aplicará directamente cualquier color que configures a través del parámetro backgroundColor. (Iecee9, b/167951441)
  • Se cambió el nombre de InnerPadding a PaddingValues. (I195f1, b/167389171)
  • Se reemplazaron los parámetros resistanceFactorAtMin y resistanceFactorAtMax en Modifier.swipeable por un solo parámetro de resistencia. Se agregó un nuevo método defaultResistanceConfig en SwipeableConstants. (I54238)
  • Se agregó compatibilidad con la elevación animada con estado para Button y FloatingActionButton. La elevación ahora anima el cambio entre los estados predeterminado y presionado. Para personalizar la elevación entre estados, en todos los casos, usa ButtonConstants.defaultAnimatedElevation() y FloatingActionButtonConstants.defaultAnimatedElevation() en lugar de establecer un valor Dp plano. (I37925)
  • El parámetro Label ahora es opcional en TextField y OutlinedTextField. (I267f6, b/162234081)

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)
  • DpConstraints y las API que usaban esas restricciones dejaron de estar disponibles. (I90cdb, b/167389835)
  • Se cambiaron los nombres de los parámetros minWidth y maxWidth de widthIn a "min" y "max", del mismo modo que para preferredWidthIn, heightIn y preferredHeightIn. (I0e5e1, b/167389544)
  • Se quitaron las acciones de semántica de desplazamiento hacia adelante y hacia atrás. Se agregaron pasos a AccessibilityRangeInfo. (Ia47b0)
  • Se cambiaron de manera coherente los nombres de los usos de gravity a align o alignment en las API de diseño. (I2421a, b/164077038)
  • Se agregaron onNode y otros métodos globales a ComposeTestRule, ya que los actuales dejarán de estar disponibles. (Ieae36)
  • Se trasladó createAndroidComposeRule y AndroidInputDispatcher desde androidx.ui.test.android a androidx.ui.test. (Idef08, b/164060572)

Versión 1.0.0-alpha02

2 de septiembre de 2020

Lanzamiento de androidx.compose.material:material:1.0.0-alpha02, androidx.compose.material:material-icons-core:1.0.0-alpha02 y androidx.compose.material:material-icons-extended:1.0.0-alpha02. La versión 1.0.0-alpha02 contiene estas confirmaciones.

Cambios en la API

  • Se agregó un componente experimental de BackdropSafold. (Iad908)

Correcciones de errores

  • Se reemplazó Matrix4 con Matrix. Se quitaron todas las otras partes del paquete de vectormath. (Ibd665, b/160140398)

Versión 1.0.0-alpha01

26 de agosto de 2020

Lanzamiento de androidx.compose.material:material:1.0.0-alpha01, androidx.compose.material:material-icons-core:1.0.0-alpha01 y androidx.compose.material:material-icons-extended:1.0.0-alpha01. La versión 1.0.0-alpha01 contiene estas confirmaciones.

Problema conocido

= El primer carácter de un material TextField no se puede quitar mediante una tecla de retroceso (b/116595613)

Versión 0.1.0-dev

Versión 0.1.0-dev17

19 de agosto de 2020

Lanzamiento de androidx.compose.material:material:0.1.0-dev17, androidx.compose.material:material-icons-core:0.1.0-dev17 y androidx.compose.material:material-icons-extended:0.1.0-dev17. La versión 0.1.0-dev17 contiene estas confirmaciones.

Cambios en la API

  • Se quitaron RadioGroup y RadioGroupItems, que anteriormente habían quedado obsoletos. En su lugar, usa Row y RadioBotton. (I381b7, b/163806637)
  • Se quitaron las devoluciones de llamada onFocusChanged de TextField. En su lugar, usa Modifier.focusObserver. (I51089, b/161297615)
  • Modifier.drawBorder dejó de estar disponible. En su lugar, usa Modifier.border. Se reemplazó la clase de datos Border por BorderStroke. (I4257d, b/158160576)
  • Se cambiaron los nombres de algunas propiedades en SwipeableState: swipeTarget -> targetValue, swipeProgress -> progress, swipeDirection -> direction. Se agregó una función rememberSwipeableState para crear SwipeableStates. (I2fc9c, b/163129614, b/163132293)
  • Se agregó compatibilidad de la barra de notificaciones con el posicionamiento y las colas adecuadas. Accede mediante la función de suspensión SnackbarHostState.showSnackbar. Además:
    • Se agregaron componentes SnackbarHost. Esto aloja las barras de notificaciones en función del estado y se encarga de la transición entre esas barras.
    • Se agregó SnackbarHostState a fin de permitir el control de las barras de notificaciones y sus hosts, así como para desacoplarlo de ScaffoldState. También puedes acceder a ese estado mediante scaffoldState.snackbarHostState.
    • Se agregó la sobrecarga de la barra de notificaciones para admitir una interfaz común entre snackbarHostState y las propias barras. (I79aaa)
  • Se agregó el parámetro habilitado a IconButton y se reordenaron los parámetros en IconToggleButton. (I0a941, b/161809385, b/161807956)
  • Se quitó la versión ListItem con la API basada en strings. En su lugar, usa la versión de ranuras. (Ib8f57, b/161804681)
  • Se quitó el componente obsoleto FilledTextField. En su lugar, usa TextField para obtener la implementación de Material Design del campo de texto Filled. (I5e889)
  • AlertDialog ahora usa FlowRow para los botones. (I00ec1, b/161809319, b/143682374)
  • Se agregaron parámetros en Modifier.swipeable para cambiar la resistencia cuando el usuario deslice más allá del límite. Se quitaron los parámetros [min/max]Value. (I93d98)
  • Se agregó el parámetro backgroundColor a LinearProgressIndicator y se quitó el padding interno de CircularProgressIndicator. Se agregó el nuevo ProgressIndicatorConstants.DefaultProgressAnimationSpec, que se puede usar como el AnimationSpec predeterminado cuando se anime el progreso entre valores. (If38b5, b/161809914, b/161804677)
  • Se agregó el parámetro opcional velocityThreshold a Modifier.swipeable. (I698ba)
  • bottomBarSize, fabSize y otros parámetros ya no están disponibles en ScaffoldState. En su lugar, usa Modifier.onPosition en el componente del cual te gustaría conocer el tamaño. Se agregaron los parámetros contentColor y Modifier a Scaffold. (Ic6f7b, b/161811485, b/157174382)
  • Se cambió el nombre y el orden de algunos parámetros en Tab por razones de coherencia con otras API. (Ia2d12, b/161807532)
  • Se dividió TabRow en TabRow y ScrollableTabRow, y se quitó isScrollable de TabRow. También se expuso edgePadding en ScrollableTabRow, que permite controlar el espacio libre antes y después de las pestañas. (I583e8, b/161809544)
  • Se quitó el objeto TabRow y se lo reemplazó por TabConstants. Se movió TabRow.TabPosition al nivel superior (TabPosition) y se cambió el nombre de indicatorContainer a indicator. Consulta los ejemplos y la documentación a fin de obtener información detallada para usar la API actualizada y sobre cuáles son los valores predeterminados. (I54d45, b/161809544)
  • Se ajustó el parámetro de límites de Modifier.swipeable. Ahora toma un par de estados (de tipo T) y muestra el límite entre ellos en forma de un ThresholdConfig. Se agregó un parámetro dismissThresholds a SwipeToDismiss, que es una lambda (DismissDirection) -> ThresholdConfig. (Ie1080)
  • El control deslizante tiene más colores para lograr una personalización detallada. (I73e64, b/161810475)
  • Se cambió el nombre del parámetro de color de Card por backgroundColor. (I01fc1, b/161809546)
  • La barra de notificaciones ahora tiene colores personalizables de fondo y contenido. (I238f2, b/161804381)
  • Se agregaron los parámetros de personalización modifier, backgroundColor, contentColor y scrimColor a Drawers. (I23655, b/161804378)
  • 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)
  • Se cambió el nombre del parámetro padding de Button por contentPadding. (Id252e, b/161809394)
  • Se agregó el componente experimental de material SwipeToDismiss. (I129e5)

Correcciones de errores

  • Se quitaron onChildPositioned y OnChildPositionedModifier. En su lugar, los desarrolladores deberán usar onPositioned y OnPositionedModifier en el diseño secundario. (I4522e, b/162109766)
  • Se agregó la lambda mergePolicy a SemanticsPropertyKey. Se puede usar con el fin de definir una política personalizada para la combinación de semántica de mergeAllDescendants. La política predeterminada es usar el valor del elemento superior si ya está presente; de lo contrario, se utiliza el valor secundario. (Iaf6c4, b/161979921)
  • IntSize ahora es una clase intercalada. (I2bf42)
  • Se cambió el nombre de PlacementScope.placeAbsolute() por PlacementScope.place(), y el del PlacementScope.place() anterior por PlacementScope.placeRelative(). Como resultado, el método PlacementScope.place() ya no duplicará automáticamente la posición en contextos de derecha a izquierda. Si quieres que eso ocurra, usa PlacementScope.placeRelative() en su lugar. (I873ac, b/162916675)
  • PxBounds dejó de estar disponible y se reemplazó por Rect. Se actualizaron todos los usos de PxBounds con rect y se agregaron la baja y reemplazo adecuados, con anotaciones para ayudar con la migración. (I37038, b/162627058)
  • Se cambió el nombre de RRect a RoundRect para que se adapte mejor a los patrones de nombres de compose. Se crearon constructores de funciones similares a RRect y los de RRect quedaron obsoletos. (I5d325)

Versión 0.1.0-dev16

5 de agosto de 2020

Lanzamiento de androidx.compose.material:material:0.1.0-dev16, androidx.compose.material:material-icons-core:0.1.0-dev16 y androidx.compose.material:material-icons-extended:0.1.0-dev16. La versión 0.1.0-dev16 contiene estas confirmaciones.

Cambios en la API

  • Colors ahora es una clase final en vez de una interfaz. En lugar de extender y proporcionar una implementación personalizada, debes crear un ambiente nuevo para tu objeto de tema personalizado y acceder a él mediante el nuevo ambiente en tus componentes, de manera similar a cómo funciona MaterialTheme internamente. (Ibae84)
  • Se cambió el nombre de ColorPalette por Colors a fin de mapear mejor el sistema de colores de Material y quitar la confusión que existía en torno a considerar ColorPalette como un objeto de temas "genérico" en lugar de considerarlo una implementación específica del sistema de colores de Material. Además, se cambió el nombre de lightColorPalette y darkColorPalette por lightColors y darkColors, respectivamente. (I9e976, b/161812111)
  • Se cambió el nombre de los parámetros de BottomNavigationItem de text a label, de onSelected a onSelect, de activeColor a selectedContentColor y de inactiveColor a unselectedContentColor. Además, se actualizó el orden de los parámetros de conformidad con los lineamientos. (Icb605, b/161809324)
  • 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)
  • Se acopló el paquete foundation.shape.corner a foundation.share. (I46491, b/161887429)
  • Se agregó la anotación ExperimentalMaterialApi. Se marcó RippleTheme como Experimental. (Ic5fa0, b161784800)
  • 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)

Correcciones de errores

  • OnChildPositioned dejó de estar disponible. En su lugar, usa el elemento secundario OnPositioned. (I87f95, b/162109766)
  • Se abordaron correcciones amplias de API. (I077bc)
    1. Se quitó la interfaz OffsetBase sin usar.
    2. Se alinearon las clases Offset y IntOffset a fin de tener una superficie de API coherente.
    3. Se cambió el nombre de IntOffset.Origin por IntOffset.Zero para que sea coherente con la API de Offset.
    4. Se quitó de la interfaz de Canvas el método nativeCanvas con el objeto de ayudar a los consumidores a crear sus propias instancias de Canvas.
    5. Se creó una clase stub EmptyCanvas para refactorizar DrawScope a fin de hacerlo un parámetro no nulo en lugar de usar lateinit y de garantizar la no nulabilidad del campo.
    6. Se cambió el nombre de las enumeraciones ClipOp para que lleven mayúsculas en la primera letra de cada palabra.
    7. Se cambió el nombre de las enumeraciones FilterQuality para que lleven mayúsculas en la primera letra de cada palabra.
    8. Se cambió el nombre de las enumeraciones StrokeJoin para que lleven mayúsculas en la primera letra de cada palabra.
    9. Se cambió el nombre de las enumeraciones PointMode para que lleven mayúsculas en la primera letra de cada palabra.
    10. Se cambió el nombre de las enumeraciones PaintingStyle para que lleven mayúsculas en la primera letra de cada palabra.
    11. Se cambió el nombre de las enumeraciones PathFillType para que lleven mayúsculas en la primera letra de cada palabra.
    12. Se cambió el nombre de las enumeraciones StrokeCap para que lleven mayúsculas en la primera letra de cada palabra.
    13. Se actualizó la implementación de DrawCache para que deje de usar parámetros lateinit.
    14. Se actualizó DrawScope a fin de que deje de usar la delegación lazy para los parámetros internos fillPaint y strokePaint.
    15. Se actualizó el objeto Image que admite composición a fin de evitar el uso de Box y lograr una sobrecarga menor.
    16. Se actualizó la clase Outline para que tenga anotaciones @Immutable.
    17. Se actualizó PathNode para que tenga anotaciones @Immutable en cada instrucción de la ruta de acceso.
    18. Se actualizó la subcomposición de Vector a fin de quitar verificaciones condicionales redundantes de igualdad dado que compose ya las administra.
    19. Los métodos de construcción complementarios de Rect dejaron de estar disponibles y se los reemplazó por constructores de funciones.
    20. Se actualizaron las clases Brush y los constructores de funciones con las API de @Immutable y @Stable.
    21. Se actualizaron las enumeraciones VertexMode para que lleven mayúsculas en la primera letra de cada palabra.
    22. Se actualizó el método selectPaint de DrawScope a fin de reemplazar condicionalmente los parámetros de trazo en la pintura si estos cambiaron.
    23. Se actualizó Size para agregar la API de desestructuración, se cambió el nombre de UnspecifiedSize por Unspecified y se quitaron métodos sin usar.
  • Se movió diálogo a la IU. (I47fa6)
  • Se quitó SemanticsNodeInteraction.performPartialGesture. Usa SemanticsNodeInteraction.performGesture en su lugar. (Id9b62)
  • Se cambió el nombre de SemanticsNodeInteraction.getBoundsInRoot() por SemanticsNodeInteraction.getUnclippedBoundsInRoot(). (Icafdf, b/161336532)
  • Se actualizaron las API correspondientes a la compatibilidad de orientación de derecha a izquierda. Se agregó LayoutDirectionAmbient, que puede usarse para leer y cambiar la dirección del diseño. Se quitaron Modifier.rtl y Modifier.ltr. (I080b3)
  • Se cambió el nombre de Modifier.determinateProgress por Modifier.progressSemantics. (I9c0b4)
  • Se actualizó material-icons-extended con los últimos íconos agregados a Material.io/icons. (I4b1d3)
  • Se requiere que el tipo T se especifique de forma explícita para transitionDefinition. (I1aded)
  • Modifier.plus dejó de estar disponible; en su lugar, usa Modifier.then. "Then" tiene un indicador de orden más fuerte, a la vez que 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 cambió el nombre de AndroidComposeTestRule por createAndroidComposeRule. (I70aaf)
  • Se agregaron los SemanticsMatcher isFocused() y isNotFocused(). (I0b760)
  • Se quitó BaseGestureScope.globalBounds, que no debería usarse a partir de pruebas. En su lugar, usa las coordenadas locales del nodo con el que interactúas. (Ie9b08)
  • Se corrigió la posición de la ventana emergente en las pantallas cortadas. (Idd7dd)
  • 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.material:material:0.1.0-dev15, androidx.compose.material:material-icons-core:0.1.0-dev15 y androidx.compose.material:material-icons-extended: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)

  • Se cambió el nombre de la devolución de llamada onFocusChange en los campos de texto por onFocusChanged. (Ida4a1)

  • Se agregó el parámetro de límites en el objeto stateDraggable para especificar límites entre los anclajes. Se usó para establecer un límite de 56 dp en el panel lateral inferior. Además, el objeto BottomDrawerLayout ahora usa una enumeración BottomDrawerState separada. (I533fa)

  • Se quitó el objeto Modifier.ripple que dejó de estar disponible previamente. El elemento Clickable ahora usa ripple como indicación predeterminada (si tienes un objeto MaterialTheme {} configurado en tu aplicación), por lo que, en la mayoría de los casos, puedes usar los elementos clickable y get ripple de forma gratuita. Para personalizar el parámetro de color/tamaño/límites para ripple, puedes crear manualmente un RippleIndication y pasarlo a clickable como parámetro de indicación. (I663b2, b/155375067)

  • Se quitó la anulación obsoleta del objeto FilledTextField que admite composición. (I7f8f8)

  • Se cambió el nombre del objeto Button (que contiene la configuraciones predeterminadas que usa la función Button) por ButtonConstants. (I7c5f7, b/159687878)

  • La ranura de contenido de Button ahora se comporta como el objeto Row (útil cuando se necesita un ícono con un texto. Consulta ejemplos en Button, cómo escribirlo). (I0ff10, b/158677863)

  • Los objetos RadioGroup y RadioGroupItem dejaron de estar disponibles. Usa el elemento Box con los objetos Modifier.selectable, Row y Column para crear un conjunto adecuado de opciones radioButton por tu diseño. (I7f5cf, b/149528535)

  • Se agregó el objeto Textfield con contorno de Material. (I1a518).

  • 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 el elemento androidx.ui.input.TextFieldValue. (I4066d, b/155211005)

  • El objeto TabRow.TabPosition no muestra la posición en el elemento Dp, ni en IntPx. (I34a07, b/158577776)

  • Se reemplazó el uso del elemento IntPx con Int. Se reemplazó el objeto IntPxPosition con IntOffset. Se reemplazó el elemento IntPxSize con IntSize. (Ib7b44)

  • A fin de consolidar las clases utilizadas para representar la información de tamaño, se estandarizó el uso de la clase Size en lugar de PxSize. Esto habilita las ventajas de una clase intercalada que permite empaquetar 2 valores de punto flotante para representar el ancho y la altura. (Ic0191)

  • El objeto Modifier.ripple dejar de estar disponible. El elemento Clickable ahora usa ripple como indicación predeterminada (si tienes un objeto MaterialTheme {} configurado en tu aplicación), por lo que, en la mayoría de los casos, puedes usar los elementos clickable y get ripple de forma gratuita. Para personalizar el parámetro de color/tamaño/límites para ripple, puedes crear manualmente un RippleIndication y pasarlo a clickable como parámetro de indicación. (I101cd, b/155375067)

  • Se modificó la API de Scaffold: se renombraron algunos parámetros y se agregaron otros para una mejor personalización. Se agregó un método getter a los tamaños de consulta de los objetos Fab, TopBar y BottomBar. (I0e7ce)

  • Se agregó el componente DropdownMenu en ui-material, una implementación del menú de Material Design. (I9bb3d)

  • Se permite mostrar/ocultar manualmente el teclado en pantalla con SoftwareKeyboardController. (Ifb9d6, b/155427736)

  • Se agregó el objeto Modifier.indication al paquete de base. Úsalo para mostrar la función de presionar/arrastrar/otra indicación en tus elementos interactivos personalizados. (I8425f, b/155287131)

  • Se consolidaron las implementaciones de CanvasScope, por lo que ahora solo quedaron los elementos DrawScope y ContentDrawScope. Se cambió el nombre del objeto CanvasScope por DrawScope. Se actualizó el elemento DrawScope para implementar la interfaz Density y proporcionar el objeto LayoutDirection. Se eliminó la subclase DrawScope en ContentDrawScope. Se actualizaron elementos Painter y PainterModifier de modo que ya no mantengan una propiedad RTL, ya que el objeto DrawScope lo proporciona sin hacerlo manualmente. (I1798e)

  • Cambia el nombre del objeto Emphasis.emphasize() por Emphasis.applyEmphasis(). (Iceebe)

  • Los botones inhabilitados ahora siguen visualmente la especificación de Material Design. (I47dcb, b/155076924)

  • El objeto RellenedTextField obtiene acción de IME, transformación visual y compatibilidad con el tipo de teclado. (I1f9cf, b/155075201)

  • Agrega el parámetro strokeWidth a CircularProgressIndicator para personalizar el tamaño del trazo. Para cambiar el tamaño del trazo (altura) de un LinearProgressIndicator, puedes usar Modifier.preferredHeight() u otro modificador de tamaño. (Icea16, b/154919081)

  • Agrega el parámetro strokeWidth a CircularProgressIndicator para personalizar el tamaño del trazo. Para cambiar el tamaño del trazo (altura) de un LinearProgressIndicator, puedes usar Modifier.preferredHeight() u otro modificador de tamaño. (Icea16, b/154919081)

  • Se agregó la API para los íconos iniciales y finales en el objeto FilledTextField y el manejo del estado de error. (Ic12e0)

  • Se cambió el color predeterminado del BAF y el BAF extendido al objeto MaterialTheme.colors.secondary. (I3b9b9, b/154118816)

  • Se reemplazaron todos los usos anulables del objeto Color en la API con valores no anulables y se usa el elemento Color.Unset en lugar de null. (Iabaa7)

  • Se cambió el nombre del objeto EdgeInsets por InnerPadding. Se cambió el nombre del parámetro innerPadding de los botones de Material por padding. (I66165)

  • El control deslizante ahora no tiene estado. Los usuarios deberán pasar y actualizar el estado por su cuenta, como con cualquier otro control. (Ia00aa)

  • Se quitó el objeto StaticDrawer. Si lo necesitas, usa el elemento Box con el ancho especificado para el material. (I244a7)

  • Se agregó la implementación de Material Design del objeto Filled Text Field. (Ic75cd)

  • Se agregó el parámetro de modificador a ListItem y se reordenaron los parámetros para ubicar el cuerpo de expresiones lambda al final. (I66e21)

  • Se agregó el parámetro de constructor defaultFontFamily a Typography, lo que permite especificar la familia de fuentes predeterminada que se usará para cualquier elemento TextStyles proporcionado que no tenga una familia establecida. (I89d07)

  • Se quitaron temporalmente tablas de datos de materiales de la superficie de la API. (Iaea61)

  • Se cambió el nombre de los parámetros en Divider que admite composición. (Ic4373)

  • elementos secundarios (Ia6d19)

  • Quita el objeto MaterialTheme.emphasisLevels; en su lugar, usa el elemento EmphasisAmbient.current para recuperar los niveles de énfasis. (IB5e40)

  • El sistema de temas de formas se actualiza según la especificación de Material Design. Ahora puedes proporcionar formas pequeñas, medianas y grandes para que las use la mayoría de los componentes. (Ifb4d1)

  • Se modificaron las API de MaterialTheme, como MaterialTheme.colors(), MaterialTheme.typography(), de modo que sean propiedades en lugar de funciones. Se quitaron los paréntesis de las llamadas existentes y no se espera ningún cambio de comportamiento. (I3565a)

  • Se refactorizaron las API de FloatingActionButton para aceptar lambdas que admitan composición en lugar de primitivas. Consulta muestras actualizadas para obtener información de uso. (I00622)

  • agrega el parámetro enabled a Checkbox, Switch y Toggleable. (I41c16)

  • Ripple ahora es un modificador. Si bien Clickable aún no se convirtió al uso recomendado, el elemento Clickable(onClick = { ... }, modifier = ripple()) sí lo es. (Ie5200, b/151331852, b/150060763)

  • Se trasladaron los objetos Surface y Card de androidx.ui.material.Surface a androidx.ui.material. (I88a6d, b/150863888)

  • Button, FloatingActionButton y Clickable ahora tienen un parámetro enabled separado. Se reorganizaron algunos de los parámetros de Button o se les cambió el nombre. (I54b5a)

  • Se cambió el nombre del objeto Image por ImageAsset a fin de destacar mejor la diferencia entre los datos de Image y el próximo elemento Image que admite composición, que se utiliza para participar en el diseño y dibujar contenido. Método de extension _Body:Created en android.graphics.Bitmap, Bitmap.asImageAsset(), a fin de crear una instancia útil del objeto ImageAsset para combinar el desarrollo tradicional de aplicaciones para Android con el marco de trabajo de Compose. (Id5bbd)

  • Se quitó la API de la barra de notificaciones con parámetros de string a fin de usar la sobrecarga que acepta funciones lambda que admiten composición. Consulta las muestras actualizadas para obtener información sobre el uso. (I55f80)

  • Se refactorizó la API de pestañas para aceptar lambdas de text y icon. (Ia057e)

  • Se agregó el componente BottomNavigation; consulta los documentos y las muestras para obtener información sobre el uso. (I731a0)

  • Se agregaron Icon, IconButton y IconToggleButton, y se quitó AppBarIcon. Puedes reemplazar directamente los usos existentes de AppBarIcon con IconButton, y tendrán el objetivo táctil correcto. Consulta las muestras para obtener información de uso y consulta Íconos para conocer los íconos de material que puedes usar directamente con estos componentes. (I96849)

  • 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)

  • cambia el nombre del modificador Border por DrawBorder. (I8ffcc)

  • El objeto LayoutCoordinates ya no tiene una propiedad de posición. La propiedad de posición no tiene sentido cuando se tienen en cuenta los objetos LayoutModifiers, la rotación o el escalamiento. En cambio, los desarrolladores deben usar los objetos parentCoordinates y childToLocal() para calcular la transformación de un objeto LayoutCoordinate a otro.

    El objeto LayoutCoordinates usa el elemento IntPxSize para la propiedad de tamaño, en lugar de PxSize. Se usan tamaños de píxeles enteros para los diseños, por lo que todos los tamaños de diseño deberían usar números enteros y no valores de punto flotante. (I9367b)

  • 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ó el componente de material de Scaffold. El objeto Scaffold implementa. (I7731b)

  • Se reemplazó el objeto DrawBorder con el modificador Border. (Id335a)

Correcciones de errores

  • El objeto FocusModifier dejó de estar disponible y se reemplazó por los elementos Modifier.focus, Modifier.focusRequester, Modifier.focusObserver. Los objetos FocusState y FocusDetailedState dejaron de estar disponibles y se los reemplazó por el elemento FocusState2. (I46919, b/160822875, b/160922136)
  • VerticalScroller y HorizontalScroller ya no están disponibles. Usa los elementos ScrollableColumn y ScrollableRow para la experiencia incorporada con los parámetros y el comportamiento de Column/Row, o los objetos Modifier.verticalScroll y Modifier.horizontalScroll en tu propio elemento. Asimismo, ScrollerPosition quedó obsoleto y se reemplazó con ScrollState'. ( I400ce, b/157225838, b/149460415, b/15105299)
  • Se rediseñaron las API de Modifier.draggable y Modifier.scrollable. Se eliminó el objeto DragDirection y se reemplazó por el elemento Orientation. Se simplificó el objeto State que se requiere para el elemento scrollable. Se cambió el nombre del objeto ScrollableState por ScrollableController. (Iab63c, b/14901515)
  • Se cambió el nombre del objeto runOnIdleCompose por runOnIdle. (I83607)
  • Las propiedades semánticas de valor único ahora usan un estilo de llamada. Por ejemplo, "semantics { hidden = true }" ahora se escribe como: "semantics { hidden() }". (Ic1afd, b/145951226, b/14559512)
  • Se cambió el nombre de varias API de prueba con el fin de que sean más intuitivas. Se cambió el nombre de todas las API findXYZ por el de onNodeXYZ. Se cambió el nombre de todas las API doXYZ por el de performXYZ. (I7f164)
  • Se modificó la API de Transition para mostrar un elemento TransitionState en lugar de pasar el objeto TransitionState a los elementos secundarios. Esto hace que la API sea más coherente con las API de animate(). (I24e38)
  • Se agregó una clase de unidad IntBounds, que representa los límites de píxeles enteros del diseño. Se actualizó la API de PopupPositionProvider para usarla. (I0d8d0, b/159596546)
  • Se agregó una nueva marca opcional useUnmergedTree a fin de probar los buscadores. (I2ce48)
  • Se quitaron las API de prueba de tamaño obsoletas. (Iba0a0)
  • Se quitó la clase intercalada Shader que une la clase de espera NativeShader. Se cambió el nombre del objeto NativeShader por Shader. La clase intercalada Shader unida no agregó ningún valor a la superficie de la API y era una clase intercalada, así que usa la clase NativeShader directamente. (I25e4d)
  • Los objetos Popups, Dialogs y Menus ahora heredan el elemento MaterialTheme contextual. (Ia3665, b/156527485)
  • El elemento Material DropdownMenu ahora es desplazable. (Ide699)
  • Del bloque de medición de la función Layout(), se quitó el parámetro de dirección del diseño. Sin embargo, la dirección de diseño está disponible dentro de la devolución de llamada a través del objeto de alcance de medición. (Ic7d9d)
  • Usa el objeto AnimationSpec en lugar del elemento AnimationBuilder en las API de nivel superior a fin de aclarar el concepto de especificación de animación estática. -Mejora la DSL de transición mediante la eliminación del requisito lambda para crear el objeto AnimationSpecs, como tween, spring. Estas toman parámetros de constructor en forma directa. -Mejora la facilidad de uso general del elemento AnimationSpec para abrir constructores en lugar de depender de compiladores. -Cambia la duración y la demora de los objetos KeyFrames y Tween al elemento Int. De esta manera, se eliminan las conversiones de tipos y los métodos de sobrecarga innecesarios (para admitir tanto los objetos Long como Int). (Ica0b4)
  • El objeto Switch ahora aparece en un estado inhabilitado cuando se configura el elemento enabled como falso. (If4624, b/155941869, b/Nave331694)
  • Se cambió el nombre del objeto Modifier.tag por Modifier.layoutId para evitar confusiones con el elemento Modifier.testTag. (I995f0)
  • El objeto Placeable#get(AlignmentLine) ya no muestra las posiciones Int de la línea de alineación como nulas. Si falta la línea de alineación consultada, se mostrará el objeto AlignmentLine.Unspecified. (I896c5, b/158134875)
  • Se refactorizó la clase Radius para que sea una clase intercalada. Se quitaron los métodos de creación complementarios para que el radio a lo largo del eje y coincida con el parámetro obligatorio del radio del eje x en el constructor de funciones con el parámetro predeterminado.

    Se actualizó el elemento DrawScope.drawRoundRect para utilizar un solo parámetro Radius en lugar de 2 números de punto flotante separados por el radio junto con los ejes x e y. (I46d1b)

  • A fin de consolidar las clases utilizadas para representar la información de posicionamiento, se estandarizó el uso de la clase Offset en lugar de PxPosition. Esto habilita las ventajas de una clase intercalada que permite empaquetar 2 valores de punto flotante para representar los desplazamientos x e y. (I3ad98)

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización para depender solo de los tipos Dp y primitivos para los parámetros de píxeles. Se borró por completo la clase Px. (I3ff33)

  • El componente Toggleable dejó de estar disponible. En su lugar, usa el elemento Modifier.toggleable. (I35220, b/15764242)

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización para depender solo de los tipos Dp y primitivos para los parámetros de píxeles. (I086f4)

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización para depender solo de los tipos Dp y primitivos para los parámetros de píxeles. (Id3434).

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización a fin de depender solo de los tipos Dp y primitivos para los parámetros de píxeles. (I97a5a)

  • Se corrigió el objeto onClick que no se podía invocar para el elemento DropdonMenuItems. (I3998b, b/157673259)

  • El objeto MutuallyExclusiveSetItem dejó de estar disponible. En su lugar, usa el elemento Modifier.selegable. (I02b47, b/157642842)

  • El componente TestTag dejó de estar disponible. En su lugar, usa el elemento Modifier.testTag. (If5110, b/157173105)

  • El cursor TextField tiene una animación intermitente. (Id10a7)

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización para depender solo de los tipos Dp y primitivos para los parámetros de píxeles. (I19d02)

  • El objeto VerticalScroller ahora proporciona el elemento Column listo para usar. El objeto HorizontalScroller ahora proporciona el elemento Row listo para usar. (Ieca5d, b/157020670)

  • Se reemplazó el uso de la clase Px en varias clases de Compose como parte de un gran esfuerzo de refactorización a fin de depender solo de los tipos Dp y primitivos para los parámetros de píxeles. (Iede0b)

  • El objeto Modifier.semantics volvió a estar disponible a fin de permitir el uso de componentes de alto nivel. (I4cfdc)

  • Se modificó la API de los modificadores DrawLayer: se cambió el nombre del objeto outlineShape por shape y tiene el valor predeterminado de RectangleShape, ahora sin valores anulables. Se cambió el nombre del elemento clipToOutline por clip; se quitó el objeto clipToBounds, ya que es igual que clip == true con RectangleShape. (I7ef11, b/155075735)

  • 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)

  • El elemento que admite composición AlineableLineOffset dejó de estar disponible. En su lugar, usa el modificador relativePaddingFrom(). Se quitó el elemento CenterAlignmentLine que admite composición. (I60107)

  • 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 el objeto layoutDirection, brinda propiedades minWidth, maxWidth, minHeight y maxHeight en Dp. (I91b9a, b/14799970)

  • Se agregó el modificador de diseño defaultMinSizeConstraints, que establece restricciones de tamaño en el diseño unido solo cuando las restricciones entrantes correspondientes no están especificadas (0 como restricción mínima e infinito como máximas). (I311ea, b/150460257)

  • Se quitó el objeto FocusManagerAmbient. Usa el elemento FocusModifier.requestFocus para obtener enfoque. (Ic4826)

  • Se creó la API de CanvasScope que une un objeto de Canvas a fin de exponer una superficie de API de dibujo declarativa y sin estado. Las transformaciones se contienen dentro de su propio alcance de receptor, y la información de tamaño también se define en los límites de inserción correspondientes. No requiere que un consumidor mantenga su propio objeto de estado de Paint para configurar las operaciones de dibujo.

    Se agregó el objeto CanvasScopeSample y se actualizó la app de demostración a fin de incluir una demostración de gráficos declarativos. (Ifd86d)

  • Se agregó personalización del color del cursor al elemento TextField. (I6e33f)

  • El objeto TextFieldValue usado con el elemento TextField ahora puede ser una recreación de una actividad que permanece vigente cuando se usa de la siguiente manera: var text by savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }. (I5c3ce, b/1505075724)

  • Cambió el nombre del objeto LayoutModifier2 por LayoutModifier. (Id29f3)

  • Se quitó la interfaz de LayoutModifier obsoleta. (I2a9d6)

  • Se reemplazó el parámetro CoreTextField/TextField focusIdentifier con el objeto FocusNode a fin de integrarlo con el subsistema de enfoque. (I7ea48)

  • Las funciones de medición intrínseca en los objetos Layout y LayoutModifier2 ahora tienen un receptor IntrinsicMeasureScope que proporciona una API de consulta intrínseca con dirección de diseño propagada de forma implícita. (Id9945)

  • Se agregó el elemento Modifier.zIndex() para controlar el orden de dibujo de los elementos secundarios dentro del mismo diseño de nivel superior. Se cambió el nombre de la propiedad de elevación de DrawLayerModifier por shadowElevation, y esta propiedad ya no controla el orden del dibujo. Se cambió el orden de los parámetros de DrawShadow: el primer parámetro ahora es elevation y el segundo es shape, con una configuración RectangleShape predeterminada. (I20150, b/152417501)

  • Se trasladó el objeto RectangleShape de androidx.ui.foundación.shape.* al elemento androidx.ui.graphics.* (Ia74d5, b/154507984)

  • Actualización de la API de TextField: se combinaron las devoluciones de llamada de onFocus y onBlur en una sola devolución de llamada de onFocusChange(Boolean) con un parámetro. (I66cd3)

  • Se agregaron los parámetros verticalGravity y horizontalGravity a los elementos Row y Column, respectivamente. (I7dc5a)

  • 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 creó la API de PixelMap para admitir consultas de información de píxeles desde un elemento ImageAsset. (I69ad6)

  • Quita el objeto ProvideContentColor; en su lugar, usa el elemento ContentColorAmbient directamente con el parámetro Providers. (Iee942)

  • Se cambió el nombre del módulo ui-text-compose por ui-text. El objeto ui-text ahora contiene los elementos CoreCore y CoreTextField que admiten composición. (IB7d47)

  • Se cambió el nombre del módulo ui-text por ui-text-core. (I57dec)

  • Se trasladaron los elementos ui-framework/CoreText, CoreTextField que admiten composición en el objeto ui-text-compose. Te recomendamos incluir el objeto ui-text-compose en tu proyecto. (I32042)

  • Mejora la API de DrawModifier:

    • Se creó el alcance del receptor para el objeto draw() ContentDrawScope.
    • Se quitaron todos los parámetros de draw().
    • El objeto DrawScope tiene la misma interfaz que el elemento CanvasScope anterior.
    • El objeto ContentDrawScope tiene un método drawContent(). (Ibaced, b/152919067)
  • Los objetos runOnIdleCompose y runOnUiThread ahora son funciones globales en lugar de ser métodos en ComposeTestRule. (Icbe8f)

  • 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 agregaron los objetos positionInParent y boundsInParent para el elemento LayoutCoordinates. (Icacdd, b/152735784)

  • El objeto ColoredRect dejó de estar disponible. En su lugar, usa el elemento Box(Modifier.preferredSize(width, height).drawBackground(color)). (I499fa, b/152753731)

  • Se cambió el nombre del objeto LayoutResult por MeasureResult. (Id8c68)

  • Se agregó el objeto LayoutModifier2, una nueva API para definir modificadores de diseño: el elemento LayoutModifier dejó de estar disponible. (If32ac)

  • Se reemplazaron el modificador y el operador por funciones de extensión. (I225e4)

  • Se movió el elemento arrastrable al modificador. (Id9b16, b/151959544)

  • El elemento ParentData que admite composición dejó de estar disponible. Debes crear un modificador que implemente la interfaz ParentDataModifier o usar el modificador LayoutTag si solo necesitas etiquetar elementos secundarios de diseño para reconocerlos dentro del bloque de medición. (I51368, b/150953183)

  • El elemento Center que admite composición quedó obsoleto. Debería reemplazarse con el modificador LayoutSize.Fill + LayoutAlign.Center o con uno de los elementos Box o Stack que admiten composición, con los modificadores adecuados aplicados. (Idf5e0)

  • Se agregó la API de VectorPainter para reemplazar la API de subcomposición existente por gráficos vectoriales. El resultado de la subcomposición es un objeto VectorPainter, en lugar de un elemento DrawModifier. El objeto DrawVector anterior que admite composición dejó de estar disponible y se reemplazó por el elemento VectorPainter.

    Se cambió el nombre de la API de Image(Painter) por PaintBox(Painter) Created Vector que admite composición y que se comporta como el elemento Image que admite composición, pero con un objeto ImageAsset. (I9af9a, b/149030271)

  • Se cambió el nombre de LayoutFlexible por LayoutWeight. Se cambió el nombre del parámetro estricto para completar. (If4738)

  • Se quitó el objeto RepaintBoundary y se reemplazó por el elemento DrawLayerModifier. (I00aa4)

  • Se cambió el comportamiento de DrawVector, que dejó de ser una función que admite composición normal para mostrar un modificador drawVector() que dibujará el vector como fondo de un diseño. (I7b8e0)

  • Se reemplazó la función Opacity que admite composición por el modificador drawOpacity. (I5fb62)

  • Reemplaza la función Clips que admite composición con el modificador drawClip(). El objeto DrawClipToBounds es un modificador conveniente para usar cuando solo necesitas recortar los límites de la capa con una forma rectangular. (If28eb)

  • Se reemplazó la función DrawShadow que admite composición con el modificador drawShadow(). Las sombras ahora se dibujan como parte de LayerModifier. (I0317a)

  • Se agregó el objeto LayerModifier, un modificador que permite agregar un elemento RenderNode a una capa. Permite configurar el recorte, la opacidad, la rotación, el escalamiento y las sombras. Reemplazará al objeto RepaintBoundary. (I7100d, b/150774014)

  • 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 elemento Composition que muestra el parámetro setContent. Se trasladó el objeto androidx.compose.Compose.subcomposeInto al elemento androidx.ui.core.subcomposeInto. Se cambió el nombre del objeto ComponentNode#emitInsertAt por ComponentNode#insertAt. Se cambió el nombre del objeto ComponentNode#emitRemoveAt por ComponentNode#removeAt. Se cambió el nombre del objeto ComponentNode#emitMode por ComponentNode#move. (Idef00)

  • Se creó un elemento Image que admite composición para controlar el tamaño y el diseño, además de dibujar un ImageAsset determinado en la pantalla. Este elemento que admite composición también admite el dibujo de cualquier instancia arbitraria de Painter que respete su tamaño intrínseco, así como un tamaño fijo determinado o un tamaño mínimo. (IBcc8f)

  • La función Wrap que admite composición dejó de estar disponible. Se puede reemplazar con el modificador LayoutAlign o con la función Stack que admite composición. (Ib237f)

  • El objeto WithConstraints tiene el parámetro LayoutDirection. (I6d6f7)

  • Se permitió que la dirección del diseño se propagara desde el nodo de diseño de nivel superior hasta los secundarios. Se agregó un modificador de dirección de diseño. (I3d955)

  • Obsoleto: el elemento Draw que admite composición es una fuente común de errores. (I78392, b/149827027)

  • El componente de pila admite la dirección de derecha a izquierda. (Ic9e00)

  • Se quitó el elemento DrawShape que admite composición. En su lugar, usa el modificador DrawBackground. (I7ceb2)

  • Compatibilidad con lectura de derecha a izquierda en el modificador LayoutPadding. (I9e8da)

  • Se agregó AdapterList, un componente de lista de desplazamiento que solo compone y presenta los elementos visibles. Según los problemas que se conocen, solo es vertical y no maneja todos los casos de cambios en sus elementos secundarios. (Ib351b)

  • 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)

  • Se agregó el componente Canvas. Este elemento que admite composición ocupa cierto tamaño (proporcionado por el usuario) y te permite dibujar con CanvasScope. (I0d622)

  • Se combinaron Density y DensityScope en una sola interfaz. En lugar de ambientDensity(), ahora puedes usar DensityAmbient.current. En lugar del objeto withDensity(density), usa el elemento with(density). (I11cb1)

  • Se modificó el objeto LayoutCoordinates para que el elemento providedAlignmentLines sea un conjunto en lugar de un mapa y para que el objeto LayoutCoordinates implemente el operador get() a fin de recuperar un valor. Esto permite que los modificadores cambien con más facilidad uno o más valores del conjunto, sin que se cree una colección nueva para cada modificador. (I0245a)

  • Los desplazadores ahora muestran el comportamiento nativo de Android. (I922af, b/147493715)

  • Mejoras en la superficie de la API de Constraints. (I0fd15)