Compose Runtime

Elementos fundamentais do modelo de programação e do gerenciamento de estado do Compose e do ambiente de execução principal do plug-in Compose Compiler.
Atualização mais recente Versão estável atual Próximo candidato a lançamento Versão Beta Versão Alfa
9 de fevereiro de 2022 1.1.0 - - 1.2.0-alpha03

Estrutura

O Compose é uma combinação de sete IDs de grupos do Maven no androidx. Cada grupo contém um subconjunto direcionado de funcionalidades, cada um com um conjunto próprio de notas da versão.

Esta tabela explica os grupos e contém links para cada conjunto de notas da versão.

GrupoDescrição
compose.animationCrie animações nos aplicativos Jetpack Compose para enriquecer a experiência do usuário.
compose.compilerTransforme funções de @composição e ative otimizações com um plug-in do compilador Kotlin.
compose.foundationCrie aplicativos do Jetpack Compose com elementos básicos prontos e amplie a base para criar suas próprias peças de sistema de design.
compose.materialCrie IUs do Jetpack Compose com componentes do Material Design prontos para uso. Este é o ponto de entrada de nível mais alto do Compose, projetado para fornecer componentes que correspondam aos descritos em www.material.io.
compose.material3Crie IUs do Jetpack Compose usando componentes do Material Design 3, a nova evolução do Material Design. O Material 3 inclui temas e componentes atualizados, além de recursos de personalização do Material You, como cores dinâmicas, e foi desenvolvido para ser coeso com o novo estilo visual do Android 12 e com a IU do sistema.
compose.runtimeElementos fundamentais do modelo de programação e do gerenciamento de estado do Compose e do ambiente de execução principal do plug-in Compose Compiler.
compose.uiComponentes fundamentais do Compose UI necessários para interagir com o dispositivo, incluindo layout, desenho e entrada.

Declarar dependências

Para adicionar uma dependência ao Compose, adicione o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.

Adicione as dependências dos artefatos necessários no arquivo build.gradle para seu app ou módulo:

Groovy

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

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.2"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

dependencies {
    implementation("androidx.compose.runtime:runtime:1.3.3")
    implementation("androidx.compose.runtime:runtime-livedata:1.3.3")
    implementation("androidx.compose.runtime:runtime-rxjava2:1.3.3")
}

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.2"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Para ver mais informações sobre dependências, consulte Adicionar dependências de build.

Feedback

Seu feedback ajuda a melhorar o Jetpack. Avise se você descobrir novos problemas ou tiver ideias para melhorar esta biblioteca. Consulte os problemas conhecidos nesta biblioteca antes de criar um novo. Adicione seu voto a um problema clicando no botão de estrela.

Criar novo problema

Consulte a documentação do Issue Tracker para saber mais.

Versão 1.2

Versão 1.2.0-alpha03

9 de fevereiro de 2022

Lançamento de androidx.compose.runtime:runtime-*:1.2.0-alpha03. A versão 1.2.0-alpha03 contém essas confirmações (link em inglês).

Mudanças na API

  • Adição do movableContentOf, que converte um lambda que pode ser composto em um que move o estado e os nós correspondentes para qualquer novo local em que ele é chamado. Quando a chamada anterior sai da composição, o estado é temporariamente preservado e, se uma nova chamada para o lambda entrar nela, o estado e os nós associados serão movidos para o local da nova chamada. Se nenhuma nova chamada é adicionada, o estado é removido permanentemente e os observadores são notificados.

    Se um lambda movableContentOf é chamado várias vezes na mesma composição, novos estados e nós são criados para cada chamada. Conforme as chamadas saem da composição e novas entram, o estado é movido das primeiras chamadas de saída para as de entrada na ordem em que são chamadas. Todo estado não reivindicado por novas chamadas é removido permanentemente (Ib4850).

  • Adição de uma API de rastreamento à composição para permitir que as ferramentas forneçam um rastreamento mais detalhado de funções de composição. Agora, o compilador gera chamadas para a API de rastreamento que incluem informações de origem (Ib0eb5).

    Para remover essas chamadas e as informações de origem associadas de um build de lançamento, adicione a seguinte regra do Proguard:

      -assumenosideeffects public class androidx.compose.runtime.ComposerKt {
          boolean isTraceInProgress();
          void traceEventStart(int,java.lang.String);
          void traceEventEnd();
      }
    
  • Adição de InternalComposeScope, que dá às ferramentas a capacidade de identificar um elemento que pode ser composto durante as recomposições (I07a3f).

Versão 1.2.0-alpha02

26 de janeiro de 2022

Lançamento de androidx.compose.runtime:runtime-*:1.2.0-alpha02. A versão 1.2.0-alpha02 contém estas confirmações.

Versão 1.2.0-alpha01

12 de janeiro de 2022

Lançamento de androidx.compose.runtime:runtime-*:1.2.0-alpha01. A versão 1.2.0-alpha01 contém essas confirmações.

Mudanças na API

  • O campo identity foi adicionado a CompositionData para gerar IDs invariáveis no Layout Inspector (Ic116e).

Atualizações de dependência

  • Agora depende do Kotlin 1.6.10.

Versão 1.1

Versão 1.1.0

9 de fevereiro de 2022

Lançamento de androidx.compose.runtime:runtime-*:1.1.0. A versão 1.1.0 contém estas confirmações.

Mudanças importantes desde a versão 1.0.0

  • Suporte estável para o efeito de rolagem do Android 12.
  • Melhorias no dimensionamento da área de toque.
  • Observe que, em relação ao Compose 1.0, os componentes do Material vão expandir o espaço de layout para atender ao tamanho da área de toque das diretrizes de acessibilidade (links em inglês) do Material Design. Por exemplo, a área de toque do botão será expandida para um tamanho mínimo de 48x48dp, mesmo que você defina um tamanho menor. Isso alinha o Compose Material ao mesmo comportamento dos componentes do Material Design para que haja consistência caso você combine visualizações e o Compose. Essa mudança também garante que, ao criar a IU usando os componentes do Compose Material, os requisitos mínimos para a acessibilidade da área de toque sejam atendidos.
  • Suporte estável à coluna de navegação.
  • Upgrade de várias APIs anteriormente experimentais para a versão estável.
  • Suporte para as versões mais recentes do Kotlin.

Versão 1.1.0-rc03

26 de janeiro de 2022

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-rc03. A versão 1.1.0-rc03 contém estas confirmações.

Correções de bugs

  • Atualização para oferecer suporte ao Compose Material 1.1.0-rc03.

Versão 1.1.0-rc01

15 de dezembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-rc01. A versão 1.1.0-rc01 contém estas confirmações.

Versão 1.1.0-beta04

1º de dezembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-beta04. A versão 1.1.0-beta04 contém estas confirmações.

Novos recursos

  • Atualização para ser compatível com Kotlin 1.6.0.

Versão 1.1.0-beta03

17 de novembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-beta03. A versão 1.1.0-beta03 contém estas confirmações.

Versão 1.1.0-beta02

3 de novembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-beta02. A versão 1.1.0-beta02 contém estas confirmações.

Mudanças na API

  • O código do snapshot foi dividido em vários arquivos, mas todos ainda estão na mesma classe JVM (Ic6c98).

Versão 1.1.0-beta01

27 de outubro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-beta01. A versão 1.1.0-beta01 contém estas confirmações.

Versão 1.1.0-alpha06

13 de outubro de 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha06 é lançado. A versão 1.1.0-alpha06 contém estas confirmações.

Mudanças na API

  • Remoção da InternalCompilerApi dos métodos do Composer que precisam ser chamados entre módulos (I1aa0b).
  • Recomposer.state foi descontinuado e substituído pelo Recomposer.currentState para mudar o tipo para um StateFlow (Ic2ab3, b/197773820).

Versão 1.1.0-alpha05

29 de setembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-alpha05. A versão 1.1.0-alpha05 contém estas confirmações.

Versão 1.1.0-alpha04

15 de setembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-alpha04. A versão 1.1.0-alpha04 contém estas confirmações.

Versão 1.1.0-alpha03

1º de setembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-alpha03. A versão 1.1.0-alpha03 contém estas confirmações.

Novos recursos

  • O Compose Compiler agora oferece suporte a versões mais antigas do Compose Runtime (1.0). Antes dessa mudança, o Compose Compiler era compatível apenas com versões iguais ou mais recentes do Compose Runtime. Agora, o Compose Compiler é compatível com uma versão mais antiga do Compose Runtime (1.0) (aosp/1796968).
  • O Compose 1.1.0-alpha03 foi atualizado para depender do Kotlin 1.5.30 (I74545).

Versão 1.1.0-alpha02

18 de agosto de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-alpha02. A versão 1.1.0-alpha02 contém estas confirmações.

Versão 1.1.0-alpha01

4 de agosto de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.1.0-alpha01. A versão 1.1.0-alpha01 contém estas confirmações.

Versão 1.0

Versão 1.0.5

3 de novembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.5. A versão 1.0.5 contém estas confirmações.

Correções de bugs

  • Uma falha de rastreamento de instâncias derivedStateOf foi corrigida (aosp/1792247).

Versão 1.0.4

13 de outubro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.4. A versão 1.0.4 contém estas confirmações.

Atualizações de dependência

  • Atualização para depender do Kotlin 1.5.31.

Versão 1.0.3

29 de setembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.3. A versão 1.0.3 contém estas confirmações.

Atualizações de dependência

  • Atualização para depender do Kotlin 1.5.30.

Versão 1.0.2

1º de setembro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.2. A versão 1.2.0 contém estas confirmações.

Atualização para oferecer suporte à versão 1.0.2 do Compose. O Compose 1.0.2 ainda é compatível com o Kotlin 1.5.21.

Versão 1.0.1

4 de agosto de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.1. A versão 1.0.1 contém estas confirmações.

Atualizações de dependência

  • Atualização para depender do Kotlin 1.5.21.

Versão 1.0.0

28 de julho de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0. A versão 1.0.0 contém estas confirmações.

Principais recursos da versão 1.0.0

Esta é a primeira versão estável do Compose. Veja mais detalhes na postagem do blog oficial sobre a versão do Compose (link em inglês).

Problemas conhecidos

  • Se você está usando o Android Studio Bumblebee Canary 4 ou o AGP 7.1.0-alpha04/7.1.0-alpha05, pode ocorrer a seguinte falha:

      java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
    

    Para corrigi-la, aumente temporariamente a minSdkVersion para 24+ no arquivo build.gradle. Esse problema será corrigido na próxima versão do Android Studio Bumblebee e no AGP 7.1 (b/194289155).

Versão 1.0.0-rc02

14 de julho de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-rc02. A versão 1.0.0-rc02 contém estas confirmações.

  • Correção de disputas em SnapshotStateObserver que causavam NullPointerExceptions esporádicas (aosp/1763445, aosp/1758105, b/192677711).
  • Correção de problemas com snapshots do ambiente de execução que causavam falhas java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied (b/193006595, b/192570897).

Versão 1.0.0-rc01

1º de julho de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-rc01. A versão 1.1.0-rc01 contém estas confirmações.

Versão 1.0.0-beta09

16 de junho de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta09. A versão 1.0.0-beta09 contém estas confirmações.

Regras de perfil adicionadas

Nesta versão, adicionamos as regras de perfil aos seguintes módulos do Compose (I14ed6):

  • androidx.compose.animation
  • androidx.compose.animation-core
  • androidx.compose.foundation
  • androidx.compose.foundation-layout
  • androidx.compose.material
  • androidx.compose.material-ripple
  • androidx.compose.runtime
  • androidx.compose.ui
  • androidx.compose.ui.geometry
  • androidx.compose.ui.graphics
  • androidx.compose.ui.text
  • androidx.compose.ui.text
  • androidx.compose.ui.unit
  • androidx.compose.ui.util

O que são as regras de perfil?

  • As regras de perfil para uma biblioteca são especificadas em um arquivo de texto baseline-prof.txt localizado no diretório src/main ou equivalente. O arquivo especifica uma regra por linha, em que uma regra, nesse caso, é um padrão para a correspondência de métodos ou classes na biblioteca. A sintaxe dessas regras é um superconjunto do formato de perfil do ART legível que é utilizada ao usar adb shell profman --dump-classes-and-methods .... Essas regras podem ter uma das duas formas destinadas a métodos ou classes.

  • Uma regra de método terá o seguinte padrão:

    <FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
    
  • E uma regra de classe terá o seguinte padrão:

    <CLASS_DESCRIPTOR>
    
  • Aqui, <FLAGS> é um ou mais dos caracteres H, S e P, para indicar se esse método precisa ser sinalizado como "Hot" (frequente), "Startup" (de inicialização) ou "Post Startup" (pós-inicialização).

  • O <CLASS_DESCRIPTOR> é o descritor da classe à qual o método desejado pertence. Por exemplo, a classe androidx.compose.runtime.SlotTable teria um descritor de Landroidx/compose/runtime/SlotTable;.

  • A <METHOD_SIGNATURE> é a assinatura do método e inclui o nome, os tipos de parâmetro e os tipos de retorno do método. Por exemplo, o método fun isPlaced(): Boolean em LayoutNode tem a assinatura isPlaced()Z.

  • Esses padrões podem ter caracteres curinga (**, * e ?) para que uma única regra inclua vários métodos ou classes.

O que as regras fazem?

  • Um método com a sinalização H indica que ele é um método "hot" (frequente) e precisa ser compilado com antecedência.

  • Um método com a sinalização S indica que ele é chamado na inicialização e precisa ser compilado com antecedência para evitar o custo da compilação e interpretação dele no momento da inicialização.

  • Um método com a sinalização P indica que ele é chamado após a inicialização.

  • Uma classe presente nesse arquivo indica que ela é usada durante a inicialização e precisa ser pré-alocada no heap para evitar o custo do carregamento dela.

Como isso funciona?

  • As bibliotecas podem definir essas regras que serão empacotadas nos artefatos do AAR. Quando um app é criado com esses artefatos, essas regras são mescladas e usadas para criar um perfil do ART binário, compacto e específico para o app. O ART poderá usar esse perfil quando o app for instalado em dispositivos para compilar antecipadamente um subconjunto específico do app e melhorar o desempenho dele, especialmente a primeira execução. Isso não terá efeito nos aplicativos depuráveis.

Versão 1.0.0-beta08

2 de junho de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta08. A versão 1.0.0-beta08 contém estas confirmações.

Mudanças na API

  • O valor State<T> agora é State<out T> (I69049).
  • Mudança na API ControlledComposition para permitir que alterações sejam recompostas em uma única transmissão de recomposição (Iaafd1, b/184173932).

Versão 1.0.0-beta07

18 de maio de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta07. A versão 1.0.0-beta07 contém estas confirmações.

Mudanças na API

  • Novas APIs do Compose Compiler que permitem que as informações de origem geradas pelo compilador sejam removidas durante a minificação da origem foram adicionadas (Ia34e6).
  • Introdução de ReusableContent, que tentará reutilizar os nós no conteúdo em vez de substituí-los quando a chave for alterada. Quando a chave for alterada, os valores anteriores na tabela de slot do conteúdo serão ignorados, exceto os nós gerados e os valores usados para atualizar os nós.

    Introdução de ReusableComposeNode que reutilizará o nó emitido em vez de substituí-lo, como feito para o ComposeNode (I1dd86).

  • @ComposeCompilerApi não precisa mais da anotação @RequiresOptIn (Iab690).

Correções de bugs

  • LazyColumn/Row manterá até dois itens visíveis anteriormente ativos (não descartados), mesmo quando eles já tiverem rolado para fora da tela. Isso permite que o componente reutilize as subcomposições ativas quando precisarmos compor um novo item, o que melhora o desempenho de rolagem (Ie5555).

Versão 1.0.0-beta06

5 de maio de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta06. A versão 1.0.0-beta06 contém estas confirmações.

Mudanças na API

  • @ComposeCompilerApi não precisa mais da anotação @RequiresOptIn (Iab690).

Versão 1.0.0-beta05

21 de abril de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta05. A versão 1.0.0-beta05 contém estas confirmações.

Mudanças na API

  • Remoção de @InternalComposeApi para gravar leituras e gravações de capturas de tela (Id134d).

Correções de bugs

  • Os arquivos AndroidManifest de ui-test-manifest e ui-tooling-data agora são compatíveis com o Android 12 (I6f9de, b/184718994).

Versão 1.0.0-beta04

7 de abril de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta04. A versão 1.0.0-beta04 contém estas confirmações.

Correções de bugs

  • Antes dessa mudança, as funções locais que podem ser compostas eram ignoradas com base nos parâmetros delas. Após essa mudança, nenhuma função local que pode ser composta será ignorada. Essa mudança é feita porque é comum e esperado que as funções locais capturem parâmetros de pai e mãe. Nesse caso, ignorá-los é uma fonte comum de bugs.

    Para resumir, considere o exemplo:

    @Composable fun Counter(count: Int, onCountChange: (Int) -> Unit) {
      @Composable fun ShowCount() { Text("Count: $count") }
      ShowCount()
      Button(onClick={ onCountChange(count + 1) }) {
        Text("Increment")
      }
    }
    

    Antes dessa mudança, a função que pode ser composta ShowCount sempre era ignorada, mesmo depois de atualizar o parâmetro count. Entretanto, esse não é mais o caso (I5648a).

  • Correção do problema quando rememberSaveable() restaurava o valor antigo ao ser usado com parâmetros de entrada (I1b110, b/182403380).

Versão 1.0.0-beta03

24 de março de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta03. A versão 1.0.0-beta03 contém estas confirmações.

Mudanças na API

  • O uso de DefaultMonotonicFrameClock foi descontinuado. Chamar withFrameNanos ou Recomposer.runRecomposeAndApplyChanges sem MonotonicFrameClock agora gerará uma IllegalStateException (I4eb0d).

Versão 1.0.0-beta02

10 de Março de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-beta02. A versão 1.0.0-beta02 contém estas confirmações.

Correções de bugs

  • Aplicação de restrições ao uso público de APIs experimentais (I6aa29, b/174531520).
  • Correção de rememberSaveable { mutableStateOf(0) } corrompidos quando usados dentro de um destino de navigation-compose (I1312b, b/180042685, b/180701630).

Versão 1.0.0-beta01

24 de fevereiro de 2021

Lançamento do androidx.compose.runtime:runtime-*:1.0.0-beta01. A versão 1.0.0-beta01 contém estas confirmações.

Esta é a primeira versão do Compose 1.0.0 Beta.

Mudanças na API

  • Adição da API experimental Recomposer.runRecomposeConcurrentlyAndApplyChanges para recompor composições invalidadas da repetição de frame principal (I342d0).
  • Os elementos que podem ser compostos marcados com @ReadOnlyComposable agora são validados no momento da compilação para garantir que eles só façam chamadas para outros @ReadOnlyComposables (I58961).
  • A defaultFactory para compositionLocalOf e staticCompositionLocalOf agora é obrigatória, não opcional.

    Essa mudança remove um possível erro para tipos não anuláveis, em que nenhuma fábrica padrão era fornecida. Anteriormente, isso forneceria uma referência nula para um tipo não anulável.

    Para tipos anuláveis, considere fornecer { null } como a fábrica padrão.

    Não recomendamos o uso de locais com tipos não anuláveis, a menos que um padrão simples possa ser fornecido. Se não houver esse padrão, o lambda defaultFactory gerará uma exceção. No entanto, isso significa que os consumidores do local terão uma dependência implícita sendo fornecida, mas não aplicada pelo sistema de tipos (Ifbd2a).

  • Os símbolos de uso suspenso foram removidos da Compose Runtime (I3252c).

  • O emptyContent() suspenso foi removido. Use {} (Idb33f, b/179432510).

  • Providers foi renomeado como CompositionLocalProvider.

    • O construtor Composition não aceita mais um parâmetro chave e foi descontinuado.
    • currentCompositeKeyHash foi transformado em uma propriedade de nível superior que pode ser composta em vez de uma função de nível superior que pode ser composta.
    • CompositionData e CompositionGroup foram movidos para o namespace androidx.compose.runtime.tooling
    • ComposableLambda foi transformada em uma interface em vez de uma classe concreta e não tem mais parâmetros de tipo.
    • ComposableLambdaN foi transformada em uma interface em vez de uma classe concreta e não tem mais parâmetros de tipo.
    • A função snapshotFlow foi movida para o namespace androidx.compose.runtime.
    • O método de mesclagem de SnapshotMutationPolicy não é mais experimental.
    • A função clearRoots de nível superior de @TestOnly foi removida. Ela não é mais necessária.
    • As funções keySourceInfoOf e resetSourceInfo foram removidas. Elas não são mais necessárias.
    • Composer.collectKeySourceInformation foi removido. Ele não é mais necessário.
    • Os métodos isJoinedKey, joinedKeyLeft e joinedKeyRight foram removidos. Eles não são mais necessários.
    • Várias APIs de nível superior foram movidas e reorganizadas em arquivos diferentes. Devido à semântica de classe de arquivos do Kotlin, essa mudança corrompe a compatibilidade binária, mas não a compatibilidade com a origem. Portanto, isso não deve ser um problema para a maioria dos usuários
    • (I99b7d, b/177245490).
  • SnapshotStateObserver não é mais experimental (Id2e6a).

  • Algumas APIs anteriormente descontinuadas foram excluídas (Ice5da, b/178633932).

  • Foram feitas as seguintes mudanças na API do Material Design:

    • Adição do parâmetro contentPadding a Top/BottomAppBar para permitir a personalização do padding padrão.
    • Os parâmetros foram reordenados no BackdropScaffold para seguir as diretrizes da API para os parâmetros obrigatórios antes dos opcionais.
    • O parâmetro icon em BottomNavigationItem foi movido para depois de selected e onClick.
    • O parâmetro alwaysShowLabels em BottomNavigationItem foi renomeado como alwaysShowLabel.
    • Os parâmetros bodyContent em alguns componentes foram renomeados como content.
    • Parâmetros reordenados em ButtonDefaults.buttonColors(). Como o tipo dos parâmetros não mudou, isso não causará um erro no seu código. Confira se está usando parâmetros nomeados ou atualize a ordem manualmente, caso contrário o código não funcionará da mesma forma que antes.
    • Adição do parâmetro secondaryVariant a darkColors(). Essa cor costuma ser a mesma que secondary no tema escuro, mas é adicionada para consistência e maior personalização.
    • Como ElevationDefaults e animateElevation() não eram muito usados / úteis, eles foram removidos da plataforma da API pública.
    • onValueChangeEnd em Slider foi renomeado como onValueChangeFinished e transformado em anulável.
    • O parâmetro text em Snackbar foi renomeado como content para manter a consistência.
    • Adição do parâmetro contentPadding a DropdownMenuItem para permitir a personalização do padding padrão. Além disso, content passou a ser uma extensão em RowScope.
    • Renomeação de ModalDrawerLayout como ModalDrawer.
    • Renomeação de BottomDrawerLayout como BottomDrawer
    • (I1cc66).

Versão 1.0.0-alpha12

10 de fevereiro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha12. A versão 1.0.0-alpha12 contém estas confirmações.

Mudanças na API

  • A compatibilidade com ViewGroups foi removida do UiApplier. Os elementos que podem ser compostos emitView com uso suspenso foram removidos (Ifb214).
  • CompositionReference renomeada para ComposeContext (I53fcb).
  • ComponentActivity.setContent foi movido para androidx.activity.compose.setContent no módulo androidx.activity:activity-compose (Icf416).
  • A API Snapshot foi atualizada para ser mais consistente com as diretrizes da API, bem como com a ocultação de classes de implementação internas da API pública (Id9e32).
  • Ambients foi renomeado para corresponder à renomeação de Ambient para CompositionLocal. Ambients costumava ser chamado de AmbientFoo. Agora, CompositionLocals será chamado de LocalFoo (I2d55d).
  • Renomeação de Ambient para CompositionLocal e de ambientOf / staticAmbientOf para compositionLocalOf / staticCompositionLocalOf, respectivamente. Essa alteração ajuda a deixar a finalidade de CompositionLocal mais clara: um mecanismo para fornecer / recuperar valores de local para uma composição. As instâncias de CompositionLocal precisam ser prefixadas com Local, como val LocalFoo = compositionLocalOf { Foo() } (Ia55b6).
  • takeMutableSnapshot e takeSnapshot foram movidos para serem métodos complementares de Snapshot (I91f19).
  • A anotação @ComposableContract foi descontinuada e substituída por três anotações mais específicas.

    A @ComposableContract(restartable = false) se tornou @NonRestartableComposable, a @ComposableContract(readonly = true) se tornou @ReadOnlyComposable, a @ComposableContract(preventCapture = true) se tornou @DisallowComposableCalls e a @ComposableContract(tracked = true) foi removida (I60a9d).

  • O uso dos utilitários emptyContent() e (@Composable () -> Unit).orEmpty() foi suspenso por eles não terem mais valor ou impacto positivo no desempenho (I0484d).

  • snapshotFlow e withMutableSnapshot não são mais experimentais (I6a45f).

  • Os recompositores agora podem ser fechados. Os recompositores fechados continuarão a recomposição até que as corrotinas filhas sejam compostas. Recomposer.shutDown foi renomeado para eliminar o contraste com o fechamento (Ib6d76).

  • O artefato compose:runtime-dispatch foi descontinuado. MonotonicFrameClock agora pode ser encontrado em compose:runtime, e AndroidUiDispatcher pode ser encontrado em compose:ui (Ib5c36).

  • A API a que o plugin do compilador do Compose é destinado foi refatorada para usar uma interface em vez de uma classe concreta. A interface também não usa mais um parâmetro de tipo.

    Essa é uma mudança interna que não afeta a compatibilidade do código-fonte, mas é uma alteração interruptiva binária (I3b922, b/169406779).

  • Introdução do SnapshotMutableState (Icfd03).

  • DisposableEffectDisposable foi renomeado para DisposaleEffectResult (Ica7c6).

  • Remoção de Recomposer.current(). Por padrão, [Abstract]ComposeView agora usa recompositores criados de forma lenta e com escopo de janela gerados pelo ViewTreeLifecycleOwner para a janela. As marcações de animação com base em withFrameNanos e em recomposição serão pausadas enquanto o ciclo de vida do host estiver parado (I38e11).

  • O Recomposer.runningRecomposers agora oferece um StateFlow global de RecomposerInfo somente leitura para observar o estado de composição em andamento no processo. Use essa API em vez de Recomposer.current(), que agora teve o uso suspenso (If8ebe).

  • DisposableEffectDisposable foi renomeado para DisposableEffectResult (I3ea68).

Versão 1.0.0-alpha11

28 de janeiro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha11. A versão 1.1.0-alpha11 contém estas confirmações.

Mudanças na API

  • Os elementos onCommit, onDispose e onActive foram descontinuados e substituídos pelas APIs SideEffect e DisposableEffect (If760e).
  • A API emit() e todas as sobrecargas foram suspensas e renomeadas para ComposeNode. As APIs são idênticas, apenas o nome é diferente para seguir as convenções de nomenclatura do Compose (I4137b).
  • Os elementos invalidate e writingReference() foram descontinuados e substituídos por currentRecomposeScope e rememberCompositionReference, respectivamente (I583a8).
  • O RememberObserver substituiu o CompositionLifecycleObserver, e o CompositionLifecycleObserver teve o uso suspenso.

    RememberObserver é uma substituição de CompositionLifecycleObserver com semânticas modificadas e métodos renomeados. A mudança para a nova API pode ser feita de maneira mecânica para objetos que são lembrados apenas uma vez e continua a ser a prática recomendada. No entanto, se uma referência foi lembrada mais de uma vez em uma composição, onRemembered é chamado para cada referência em que onEnter é chamado apenas uma vez. onEnter era chamado várias vezes se o objeto fosse usado em subcomposições, como WithConstraints e Scaffold, tornando a única garantia de chamada de onEnter não confiável, e foi removido para RememberObserver.

    RememberObserver adiciona onAbandoned, que é chamado se a instância de RememberObserver é retornada do callback transmitido para remember, mas não é lembrada no estado de composição e, portanto, nunca terá a chamada de onRemembered. Isso poderá ocorrer se uma exceção encerrar a composição antes que ela seja concluída ou se a composição for descartada porque o estado para o qual ela estava produzindo uma composição não é mais atual ou necessário. Se a instância de RememberObserver após a recomendação de referência única acima estiver acompanhando um recurso externo, onForgotten e onAbandoned indicam que o recurso não é mais necessário. Se o objeto estiver rastreando o trabalho iniciado ou os recursos alocados em onRemembered, onAbandoned poderá ser ignorado, porque ele não será chamado se onRemembered for chamado (I02c36).

  • Não marque funções collectAsState() como inline (Ia73e4).

Correções de bugs

  • WithConstraints foi reformulada como BoxWithConstraints e movida para foundation.layout (I9420b, b/173387208).
  • Use TestCoroutineDispatcher nos testes (I532b6).

Versão 1.0.0-alpha10

13 de janeiro de 2021

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha10. A versão 1.0.0-alpha10 contém estas confirmações.

Alteração interruptiva

  • A reestruturação da API do compilador interno permite criar lotes de mudanças nos nós gerados como resultado da composição na fase de "aplicar mudanças", após a conclusão de todas as funções @Composable.

    Essa é uma mudança comportamental que pode afetar o código do aplicativo, já que os nós não estão mais disponíveis em APIs internas e experimentais até que as mudanças sejam aplicadas. Isso pode ser resolvido com código circundante com dependências em um composto SideEffect para adiar a execução do código até que os nós tenham sido criados e inicializados (I018da).

Mudanças na API

  • Adição de uma maneira de rastrear se o Recomposer aplicou mudanças (I1b3e2).
  • Expansão das APIs [Abstract]ComposeView para permitir a reciclagem de visualizações baseadas no Compose, descartando a composição delas para recriar novamente mais tarde. Adição de APIs para instalar e descobrir Recomposers e CompositionReferences com escopo de janela para criar composições filhas.

    Adição do ViewComposeStrategy para configurar a estratégia de descarte de composição do [Abstract]ComposeViews. O comportamento padrão é descartar na remoção da janela (I860ab).

Correções de bugs

  • O Recomposer agora expõe um fluxo do estado atual, permitindo o monitoramento da sua atividade e da atividade de efeitos associados (Ifb2b9).
  • O keyEvent nativo agora pode ser acessado pelo keyEvent.nativeKeyEvent (I87c57, b/173086397).

Versão 1.0.0-alpha09

16 de dezembro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha09. A versão 1.0.0-alpha09 contém estas confirmações.

Mudanças na API

  • Remoção de SlotTable, SlotReader e SlotWriter da API pública. Antes, eles eram marcados como InternalComposeAPI. Agora, eles são internos do módulo do Compose.

    CompositionData e CompositionGroup foram adicionados como substitutos da API de IU para extrair as informações da composição. Eles são públicos, mas não são destinados para uso fora da API de IU, já que fornecem as informações brutas que a API de IU interpreta (I31a9c).

  • A classe Applier não é mais considerada uma (Id85b0).

  • A interface Applier foi modificada para simplificar a criação de árvores de baixo para cima, em vez de cima para baixo.

    O método insert() foi renomeado como insertTopDown().

    Um novo método, insertBottomUp(), foi adicionado.

    Uma Applier insere nós na árvore que está editando com insertTopDown() ou insertBottomUp(), dependendo de qual apresenta melhor desempenho.

    Algumas árvores, como LayoutNode e View, são muito mais eficientes para criação de baixo para cima do que de cima para baixo. Antes dessa mudança, uma pilha de inserções era necessária para implementar de baixo para cima. Ela precisava ser copiada para cada Applier, que precisava da construção de baixo para cima para ter bom desempenho. Com essa mudança, um Applier substitui um insertBottomUp() para criar uma árvore de baixo para cima, e insertTopDown() para criar a árvore de cima para baixo (Icbdc2).

  • O Compose é compatível com getters de propriedade que podem fazer invocações de composição. A compatibilidade permanece, mas a sintaxe para declarar um getter da propriedade como @Composable foi modificada.

    A sintaxe agora obsoleta para fazer isso era a anotação da propriedade em si:

        @Composable val someProperty: Int get() = ...
    

    A sintaxe que agora é correta para fazer isso é a anotação do getter da propriedade:

       val someProperty: Int @Composable get() = ...
    

    As duas sintaxes funcionarão por algum tempo, mas a antiga obsoleta se tornará um erro de compilação (Id9197).

Correções de bugs

Versão 1.0.0-alpha08

2 de dezembro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha08. A versão 1.0.0-alpha08 contém estas confirmações.

Mudanças na API

  • Adição de verificação de lint para posicionamento e nomeação do parâmetro lambda composto, para verificar a consistência com as diretrizes do Compose. Também ocorreu a migração de algumas APIs usando children como o nome do lambda final para content, de acordo com a verificação e as orientações do lint (Iec48e).
  • O Recomposer não aceita mais um EmbeddingContext. As dependências de programação necessárias são adquiridas no effectCoroutineContext. O FrameManager está suspenso. As integrações de plataforma precisam inicializar o próprio gerenciamento global de snapshots (I02369).
  • A função RestorableStateHolder.withRestorableState foi renomeada como RestorableStateProvider (I66640).

Correções de bugs

  • Ambientes suspensos nomeados com Ambient como sufixo e substituídos por novas propriedades prefixadas com Ambient, seguindo outras diretrizes da API Compose e Ambients (I33440).
  • Remoção do antigo módulo ui-test e dos stubs dele (I3a7cb).

Versão 1.0.0-alpha07

11 de novembro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha07. A versão 1.0.0-alpha07 contém estas confirmações.

Novos recursos

Mudanças na API

  • A anotação @UnionType foi suspensa (I57cde).
  • provideDefault foi adicionado como alternativa para fornecer ambientes e pode ser usado para especificar valores de ambiente que só serão definidos quando não houver um valor de ambiente já fornecido (Id6635, b/171024925).
  • LaunchedTask foi renomeado como LaunchedEffect para fins de consistência com as APIs SideEffect e DisposableEffect. Para incentivar as práticas recomendadas, o LaunchedEffect sem parâmetros de assunto não será permitido (Ifd3d4).
  • Agora, o Applier tem callbacks BeginChanges/onEndChanges que são invocados quando um Composer começa/termina de aplicar as mudanças na árvore. Isso pode ser usado para o gerenciamento de recursos de agrupamento, se necessário (Icf476).
  • O Recomposer agora exige um CoroutineContext na construção (Ic4610).
  • Mudanças na implementação interna de SlotTable que não afetarão a API pública (If9828).
  • Adaptadores rxjava2 obsoletos que não assumem o valor inicial foram removidos (Idb72f).

Correções de bugs

  • O elemento foundation.Text foi descontinuado e substituído por material.Text. Para uma API de texto básica e discreta que não consome valores de um tema, consulte androidx.compose.foundation.BasicText (If64cb).
  • O uso de BaseTextField foi descontinuado. Use BasicTextField (I896eb).
  • Vários símbolos relacionados ao layout foram movidos de androidx.compose.ui para androidx.compose.layout.ui (I0fa98, b/170475424).

Contribuição externa

  • Adição do módulo runtime-rxjava3 para Compose. Semelhante a runtime-rxjava2 (I02cbf).

Versão 1.0.0-alpha06

28 de outubro de 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha06 é lançado. A versão 1.0.0-alpha06 contém estas confirmações.

Mudanças na API

  • O Recomposer agora é um ComposeReference e um pai de composição válido. Agora, o Recomposer explícito é obrigatório em menos lugares (I4036f).
  • Adição da API de contraparte de DisposableEffect ao SideEffect, preenchendo o papel de onCommit-with-params, mas com um onDispose obrigatório.
    • Adição da API rememberUpdatedState para publicar dados de recomposição para processos contínuos ou de longa duração, como DisposableEffects ou LaunchedTasks
    • (Id50b9).
  • MutableVector agora implementa RandomAccess (I85d73, b/170461551).
  • Adição do elemento que pode ser composto do SideEffect para aplicar efeitos colaterais de composição a objetos gerenciados pela composição. O SideEffect tem como objetivo substituir o elemento que pode ser composto do onCommit (Ia77c2).
  • Novo RestorableStateHolder da API experimental. Permite salvar o estado definido com [savedInstanceState] e [rememberSavedInstanceState] para a subárvore antes de descartá-la para possibilitar a recomposição dela na próxima vez com o estado restaurado (I66884, b/166586419).

Correções de bugs

  • Ativação de transições em ComposeTestRule. Remoção da opção para ativar o cursor piscante na ComposeTestRule (If0de3).

Versão 1.0.0-alpha05

14 de outubro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha05. A versão 1.0.0-alpha05 contém estas confirmações.

Mudanças na API

  • Suspensão do modificador de entrada pelo Modifier.pointerInput experimental (Ia77d2).
  • O desempenho de rolagem de LazyColumn/Row foi melhorado com menos trabalho na subcomposição em cada rolagem. O novo método hasInvalidations() foi adicionado para a classe Composition. O método hasPendingChanges() do Recomposer foi renomeado como hasInvalidations() (Ib2f32, b/168293643, b/167972292, b/165028371).
  • Adição da API productState para iniciar corrotinas da composição que atualizam um único valor State<T> ao longo do tempo (Id4a57).
  • launchInCompose foi renomeado como LaunchedTask para corresponder às diretrizes da API Compose (I99a8e).
  • Agora, a ordem das chamadas place() em Layouts personalizados define a ordem de desenho para os filhos (Ibc9f6).

Versão 1.0.0-alpha04

1º de outubro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha04. A versão 1.0.0-alpha04 contém estas confirmações.

Mudanças na API

  • Adição de OwnerScope para permitir a coleta de escopos de observação de desenho e layout quando eles deixam de ser válidos (Ic4cf8).
  • Adição da API deriveStateOf para criar objetos State com base em um cálculo que pode ler e derivar de outros objetos State (If758b).
  • Adição da API TestOnly para SnapshotStateObserver (I6e2a9).

Correções de bugs

  • O uso de foundation.Box foi descontinuado. Use foundation.layout.Box (Ie5950, b/167680279).

Versão 1.0.0-alpha03

16 de setembro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha03. A versão 1.0.0-alpha03 contém estas confirmações.

Mudanças na API

  • CompositionCoroutineScope não implementa mais MonotonicFrameClock. Os autores de chamadas de withFrameNanos precisam importar a função de nível superior explicitamente (Icb642, b/166778123).

Correções de bugs

  • As funções de teste globais, como onNode ou waitForIdle, estão obsoletas. Migre para as novas contrapartes que estão definidas em ComposeTestRule (I7f45a).
  • launchInComposition não inicia mais corrotinas não despachadas (Ief6af, b/166486000).

Versão 1.0.0-alpha02

2 de setembro de 2020

Lançamento de androidx.compose.runtime:runtime-*:1.0.0-alpha02. A versão 1.0.0-alpha02 contém estas confirmações.

Mudanças na API

  • Adicione as APIs snapshotFlow e withMutableSnapshot para consumir e produzir modificações de dados de snapshots (I3e722).
  • A convenção de chamada para funções que podem ser compostas foi modificada. Essa é uma alteração interruptiva binária. Todas as bibliotecas precisam ser recompiladas para funcionar com essa versão do plug-in compilador do Compose.

    Essa mudança não cria uma alteração interruptiva no nível da origem, uma vez que as únicas APIs que foram modificadas são APIs do compilador que têm uma permissão explícita (I7afd2, b/158123185).

  • Remoção dos métodos de programação do EmbeddingContext (I7b9be)

  • O uso de onPreCommit foi descontinuado. Agora, o onCommit tem o comportamento do onPreCommit.

    O onCommit e o onActive agora são executados no mesmo frame "choreographer" que as mudanças de composição confirmadas, em vez de no início do próximo frame "choreographer" I70403

Versão 1.0.0-alpha01

26 de agosto de 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha01 é lançado. A versão 1.0.0-alpha01 contém estas confirmações.

Versão 0.1.0-dev

Versão 0.1.0-dev17

19 de agosto de 2020

Lançamento de androidx.compose.runtime:runtime-*:0.1.0-dev17. A versão 0.1.0-dev17 contém estas confirmações.

Mudanças na API

  • Agora, as emissões personalizadas podem declarar que um ou mais setters podem ser ignorados e recompostos independentemente da emissão (Ibbd13)
  • As chamadas FrameManager descontinuadas foram removidas.

    As APIs de composição interna foram mudadas para reduzir a quantidade de sobrecarga para rastrear objetos de estado, como mutableStateof() (I80ba6).

  • O elemento que pode ser composto state { ... } foi descontinuado e substituído pelas chamadas explícitas para remember { mutableStateOf(...) } para maior clareza. Isso reduz a plataforma geral da API e o número de conceitos de gerenciamento de estado e corresponde ao padrão by mutableStateOf() para delegação de propriedade de classe (Ia5727).

  • Agora, Flow.collectAsState determina o agente padrão da composição, em vez de usar o Dispatchers.Main (I9c1d9).

  • Correção da falha que ocorria quando algo que salvava o estado era usado dentro do loop. Agora, é permitido ter a mesma chave em savedInstanceState(), a API UiSavedStateRegistry está ajustada para esse novo requisito (I4ab76, b/160042650, b/156853976, b/159026663, b/154920561)

Correções de bugs

  • O uso de emitView foi descontinuado. Use AndroidView, se possível, para emitir Views dentro do Compose. A composição direta de Views e ViewGroups não estará disponível no futuro, a menos que elas sejam folhas da árvore de composição. Nesse caso, a composição direta será possível usando o AndroidView (I29b1e, b/163871221)

Versão 0.1.0-dev16

5 de agosto de 2020

androidx.compose.runtime:runtime-*:0.1.0-dev16 é lançado. A versão 0.1.0-dev16 contém estas confirmações.

Mudanças na API

  • A política de mutação padrão de mutableStateOf(), ambientOf() e savedInstanceStateOf() foi mudada para structuralEqualityPolicy() em vez de referentialEqualityPolicy().

    Agora, para decidir se um novo valor atribuído a uma instância de mutableStateOf() é considerado uma mudança, o padrão é usar == em vez de ===.

    Consulte https://kotlinlang.org/docs/reference/equality.html (link em inglês)

    ambientOf() e savedInstanceStateOf() usam mutableStateOf() nas implementações deles, então eles foram mudados para que haja consistência com mutableStateOf().

    O uso da igualdade estrutural se aproxima mais das expectativas do desenvolvedor.

    Por exemplo,

    val state = mutableStateOf(1f)
    

    seguido por

    state.value = 1f
    

    não será mais considerado como uma mudança no state, e os usos do state durante a composição não precisarão mais ser recompostos.

    Essa é uma alteração interruptiva, mas geralmente isso não tem um efeito perceptível em um aplicativo, como ao usar classes que não modificam equals().

    As classes que modificam equals(), como as classes data, podem ter uma degradação no desempenho, porque os métodos equals() agora são, por padrão, chamados quando atribuídos a um mutableStateOf().

    O comportamento anterior pode ser restaurado adicionando o parâmetro de política policy = referentialEqualityPolicy() às chamadas para mutableStateOf(), ambientOf() e savedInstanceStateOf() (Ic21a7).

  • Row e Column agora executam funções in-line reduzindo significativamente a sobrecarga de uso (I75c10).

Correções de bugs

  • Suspensão de setViewContent. Use setContent (I7e497, b/160335130).
  • Adição de MonotonicFrameAnimationClock que permite usar um MonomonicFrameClock como um AnimationClockObservable para fazer a ponte entre os novos relógios e APIs baseados em corrotinas que ainda usam os relógios antigos baseados em callback.

    O equivalente de ManualAnimationClock do ManualAnimationClock agora é ManualFrameClock (I111c7, b/161247083).

  • O Modifier.stateDraggable foi completamente reformulado e renomeado como Modifier.swipeable. Uma nova classe SwipeableState foi introduzida, e as DrawerState e BottomDrawerState foram refatoradas para herdar dela. [Modal/Bottom]DrawerLayout não usa mais um parâmetro onStateChange (I72332, b/148023068).

  • O uso de Modifier.plus foi descontinuado. Use Modifier.then. "Then" tem um sinal mais forte de ordem, mas também proíbe o tipo Modifier.padding().background() + anotherModifier, que interrompe a cadeia e é mais difícil de ler (Iedd58, b/161529964).

  • SubcomposeLayout foi adicionado. Trata-se de um primitivo de baixo nível que permite compor os filhos durante a medição se quisermos usar posteriormente alguns valores disponíveis, durante a medição para a composição da subárvore. Por exemplo, WithConstraints não é implementado usando SubcomposeLayout (I25cc8)

  • O FilledTextField do Material foi renomeado como TextField, e o TextField de base foi renomeado como BaseTextField para facilitar a descoberta e o uso da API mais simples desejada (Ia6242, b/155482676).

  • Renomeação de Modifier.drawBackground como Modifier.background (I13677).

Versão 0.1.0-dev15

22 de julho de 2020

Lançamento de androidx.compose.runtime:runtime-*:0.1.0-dev15. A versão 0.1.0-dev15 contém estas confirmações.

Atualização de dependências

  • Para usar a versão 0.1.0-dev15 do Compose, será necessário atualizar suas dependências de acordo com os novos snippets de código mostrados acima em Como declarar dependências.

Mudanças na API

  • A anotação @Model agora está obsoleta. Use state e mutableStateOf como alternativas. Essa decisão de descontinuação foi tomada após uma discussão cuidadosa.

    Motivo

    O motivo inclui, mas não se limita ao seguinte:

    • Reduz a área de superfície da API e os conceitos que precisamos ensinar.
    • Alinha-se melhor a outros kits de ferramentas comparáveis (Swift UI, React, Flutter).
    • Decisão reversível. Podemos trazer @Model de volta a qualquer momento.
    • Remove o uso de caso isolado e dificulta responder a perguntas sobre como configurar o @Model como coisas que precisamos lidar.
    • Classes de dados @Model, equals, hashcode etc.
    • Como faço para que algumas propriedades sejam "observadas" e outras não?
    • Como especificar a igualdade organizacional x referencial a ser usada na observação?
    • Reduz a "mágica" no sistema. Reduziria a probabilidade de alguém supor que o sistema era mais inteligente do que é (ou seja, saber diferenciar uma lista).
    • Torna a granularidade da observação mais intuitiva.
    • Aprimora a refatoração da propriedade "variável" na classe.
    • Abre potencialmente possibilidades para fazer otimizações específicas do estado.
    • Alinha-se melhor ao restante do ecossistema e reduz ambiguidades em relação a imutáveis ou a "adotar o estado mutável".

    Notas de migração

    Quase todos os usos existentes de @Model são facilmente transformados de duas maneiras. O exemplo abaixo tem uma classe @Model com duas propriedades apenas para fins de exemplo e sendo usada em um composto.

    @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: use State<OriginalClass> e crie cópias.

    Essa abordagem é facilitada com as classes de dados do Kotlin. Basicamente, transforme todas as propriedades var anteriores em propriedades val de uma classe de dados, use state em vez de remember e atribua o valor do estado a cópias clonadas do original usando o método de conveniência copy(...) da classe de dados.

    É importante observar que essa abordagem só funciona quando as únicas mutações para essa classe foram feitas no mesmo escopo em que a instância de State foi criada. Se a classe estiver se modificando internamente fora do escopo de uso e você estiver contando com a observação disso, a próxima abordagem será a que você deve usar.

    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: use mutableStateOf e delegados de propriedade.

    Essa abordagem é facilitada com os delegados de propriedade do Kotlin e a API mutableStateOf, que permite criar instâncias do MutableState fora da composição. Basicamente, substitua todas as propriedades var da classe original por var com mutableStateOf como delegado da propriedade. A vantagem é que não haverá mudança no uso da classe, apenas na implementação interna dela. No entanto, o comportamento não é completamente idêntico ao exemplo original, já que cada propriedade agora é observada/inscrita individualmente. Portanto, as recomposições que você vê após essa refatoração podem ser mais restritas (uma coisa boa)

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

  • Muda a estratégia de geração de código do compilador do Compose. Antes da mudança, ele transformava chamadas em funções compostas. Com essa mudança, agora transformamos o corpo de uma função composta e deixamos o local de chamadas praticamente inalterado.

    Isso significa que a maior parte da lógica que se comunica com o ambiente de execução do Compose acontece no início do corpo da função e não no local de chamadas.

    Essa deve ser uma mudança compatível com a fonte para todo o uso do Compose. A maioria dos usuários do Compose não precisa atualizar nenhum código como resultado dessa mudança.

    Para oferecer suporte a esse trabalho, a assinatura JVM de todas as funções compostas foi mudada. Uma função composta que aceita um único parâmetro é transformada em uma função que aceita três parâmetros. Os parâmetros adicionais são o Composer, um número inteiro "chave", um inteiro de bitmask usado para propagar metadados por meio de chamadas.

    O Compose agora também transforma argumentos padrão em uma função composta. Ele faz isso sem introduzir uma sobrecarga padrão sintética adicional da própria função. Portanto, essa mudança resultará na definição de menos funções.

    Mudanças comportamentais intencionais conhecidas resultantes disso:

    1. Algumas chamadas serão ignoradas.
    2. As expressões compostas em expressões de argumento padrão agora são corretamente inscritas e processadas.

    Esse trabalho incluiu algumas otimizações: 1. O resultado das comparações de parâmetros é propagado por meio do gráfico de chamadas para outras funções compostas. Isso resultará em menos comparações no momento da execução, reduzirá o tamanho da tabela de slots, bem como mais pulos de funções compostas que não foram ignoradas anteriormente. 2. Os parâmetros que são determinados como "estáticos" no momento da compilação não são mais comparados ou armazenados no ambiente de execução. Isso reduz o número de comparações e o tamanho da tabela de slots. 3. A estrutura do controle de fluxo do corpo das funções é usada para minimizar o número de grupos gerados. Isso reduz o tamanho da tabela de slots e resulta em menos trabalho para o ambiente de execução. 4. Os parâmetros de envio e destinatário não utilizados para funções não são incluídos para determinar a possibilidade de pular a função se eles não forem usados dentro do corpo da função.

    A maioria das mudanças interruptivas foi feita em APIs que o compilador segmenta diretamente. O uso típico do Compose não será afetado: 1. Composer::startExpr foi removido. 2. Composer::endExpr foi removido. 3. O Composer::call foi suspenso. 4. As sobrecargas que não são varargs de key foram removidas. Use a versão vararg daqui em diante. 5. A anotação Pivotal foi suspensa. Use key como substituto. 6. ScopeUpdateScope::updateScope foi modificado para esperar uma Function3 em vez de Function1 7. restartableFunction e restartableFunctionN foram atualizadas para incluir outros parâmetros de tempo de compilação (I60756, b/143464846).

  • Adição de sortWith e removeRange ao MutableVector (Icccf7).

  • Adição de implementações de método padrão para CompositionLifecycleObserver (I24289).

  • O Applier agora requer um método clear() para descartar composições (Ibe697).

  • Adição de asMutableList() ao MutableVector para permitir que ele seja transmitido para a API pública sem ter que copiar a lista inteira (I298df).

  • Adição de rememberCoroutineScope() para receber um CoroutineScope gerenciado na composição para iniciar jobs em resposta a eventos (I0e264).

  • MutableVector é uma nova coleção, que não implementa nenhuma interface padrão de Collection. Essa coleção oferece velocidade acima de outros requisitos e é destinada ao uso apenas em implementações internas (I8ebd6).

  • StableMutableList e StableMutableMap foram removidos temporariamente para evitar um problema na versão do Compose que o Kotlin exige. Essas interfaces serão usadas novamente quando o Compose for atualizado para uma versão do Kotlin que não tenha o problema.

    SnapshotStateList e SnapshotStateMap agora são públicos, mas ficarão obsoletos depois que StableMutableList e StableMutableMap forem restaurados (Ia7769).

  • Adição de função withFrameNanos de nível superior para tempo de animação (Ie34c5).

  • A anotação @Untracked foi suspensa. Substitua por @ComposableContract(tracked=false) (Id211e).

  • RestartableFunction e as APIs associadas foram renomeadas como ComposableLambda etc. Essas APIs foram segmentadas apenas pelo compilador, então isso geralmente não afetará a compatibilidade no nível da fonte. A renomeação foi feita principalmente para comunicar que essa classe é melhor quando aparece em stack traces (I7eb25).

  • A anotação @Composable não é mais válida em classes (Ia5f02).

  • Ambient<T> agora é @Stable em vez de @Immutable (I0b4bb).

  • Antes da mudança, o plug-in do compilador do Compose interceptava chamadas a construtores dentro de uma função @Composable se houvesse um (I5205a, b/158123804).

  • O composto Recompose não é mais uma abstração útil. A maioria das recomposições precisa acontecer como resultado de atribuições MutableState. Para qualquer coisa além disso, é recomendável usar a função invalidate para acionar uma recomposição do escopo atual (Ifc992).

  • Observe não é mais uma abstração útil. Se você precisar replicá-la, a implementação dela poderá ser replicada apenas com a criação de uma função que pode ser composta que execute um parâmetro lambda de composição. Por exemplo, @Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37, link em inglês).

  • O uso de @Direct foi descontinuado e substituído por @ComposableContract(reinicable=false) (If4708).

  • Adição de um adaptador para o StateFlow introduzido recentemente que permite preencher o valor inicial para que o estado retornado não seja anulável (I61dd8, b/156233789).

  • Foi adicionado um adaptador para o fluxo. Exemplo de uso: valor val por fluxo.collectAsState() (If2198, b/153375923).

  • [Mutable] Os operadores para delegação de propriedade de estado foram movidos para extensões compatíveis com as otimizações de delegação de propriedade do Kotlin 1.4. Os autores da chamada precisam adicionar importações para continuar usando by state { ... } ou by mutableStateOf(...) (I5312c).

  • O androidx.composte.ViewComposer foi movido para androidx.ui.node.UiComposer. androidx.compose.Emittable foi removido. Isso era redundante com o ComponentNode. O androidx.compose.ViewAdapters foi removido. Eles não são mais um caso de uso compatível. O uso de Compose.composeInto foi descontinuado. Use setContent ou setViewContent. O uso de Compose.disposeComposition foi descontinuado. Use o método dispose no Composition retornado pelo setContent. androidx.compose.Compose.subcomposeInto foi movido para androidx.ui.core.subcomposeInto. ComponentNode#emitInsertAt foi renomeado como ComponentNode#insertAt. ComponentNode#emitRemoveAt foi renomeado como ComponentNode#removeAt. ComponentNode#emitMode foi renomeado como ComponentNode#move (Idef00).

  • A sinalização ComposeFlags.COMPOSER_PARAM foi atualizada para true, o que mudará a estratégia de geração de código para o plug-in do Compose. Em um nível alto, isso faz com que funções @Composable sejam geradas com um parâmetro sintético extra, que é transmitido para chamadas @Composable subsequentes para que o ambiente de execução gerencie corretamente a execução. No entanto, essa é uma alteração interruptiva no binário que precisa preservar a compatibilidade no nível da fonte em todo o uso do Compose (I7971c).

  • Alterações interruptivas na API de ambientes. Consulte o registro e a documentação do Ambient<T> para ver detalhes (I4c7ee, b/143769776).

  • Adição de ui-livedata: novo artefato com um adaptador para LiveData. Exemplo de uso: valor val por liveData.observeAsState() (Ie9e8c, b/150465596).

  • Os adaptadores Rx sem valor inicial explícito foram descontinuados. Usar null nem sempre é o melhor padrão. Por exemplo, quando você tem uma lista, é melhor começar com emptyList() ou qualquer outro padrão razoável (I00025, b/161348384).

  • Adição de ui-rxjava2: novo artefato com adaptadores para RxJava2. Exemplo do uso: valor val por observable.subscribeAsState() (Ifab4b, b/153369097).

  • savedInstanceState() agora pode ser usado com tipos anuláveis (I6847f, b/153532190).

  • Novo listSaver() e mapSaver() para facilitar a gravação de objetos Saver personalizados (I8cf68, b/152331508).

  • Novas funções: savedInstanceState() e rememberSavedInstanceState(). Elas são semelhantes a state() e remember(), mas têm uma versão de estado de instância salva em (If1987, b/152025209).

Correções de bugs

  • runOnIdleCompose foi renomeado como runOnIdle (I83607).
  • Criação da API experimental LayoutNode (I4f2e9).
  • O androidx.ui.foundation.TextFieldValue e o androidx.ui.input.EditorValue foram descontinuados. Os compostos TextField, FilledTextField e CoreTextField que usam esse tipo também foram suspensos. Use androidx.ui.input.TextFieldValue (I4066d, b/155211005).
  • A API DrawBackground descontinuada foi removida e substituída pelas APIs de extensão drawBackground no Modifier. Implementações de drawBackground de cores, pincéis e pintura refatoradas para reduzir os caminhos de código, além de remover o requisito para que o Modifier seja criado como parte da composição (I0343a).
  • Atualização das APIs de composição de nível superior que expõem uma tela para expor o CanvasScope. Isso elimina a necessidade dos consumidores manterem seus próprios objetos do Paint. Os consumidores que ainda precisam de acesso a uma tela podem usar o método de extensão drawCanvas, que fornece um callback para emitir comandos de desenho (I80afd).
  • A API WithConstraints lambda final foi mudada. Agora, em vez de dois parâmetros, ele tem um escopo de receptor que, além de restrições e layoutDirection, fornece as propriedades minWidth, maxWidth, minHeight e maxHeight no Dp (I91b9a, b/149979702).
  • Modificador de preenchimento simétrico adicionado (I39840).
  • Atualização de wrapContentWidth e wrapContentHeight para esperar um alinhamento vertical ou horizontal em vez de qualquer outro. O modificador de gravidade foi atualizado para aceitar o alinhamento vertical ou horizontal. Row, Column e Stack foram atualizados para ter compatibilidade com alinhamentos contínuos personalizados (Ib0728).
  • O módulo ui-text foi renomeado como ui-text-core (I57dec).
  • Melhora da API DrawModifier:
    • Definição do escopo do receptor para draw() ContentDrawScope.
    • Remoção de todos os parâmetros em draw().
    • DrawScope tem a mesma interface que o antigo CanvasScope.
    • O ContentDrawScope tem o método drawContent() (Ibaced, b/152919067).
  • O uso de ColoredRect foi descontinuado. Use Box(Modifier.preferredSize(width, height).drawBackground(color)) (I499fa, b/152753731).
  • Substituição de Modifier mais operador por funções de extensão de fábrica (I225e4).
  • Os membros de RowScope e ColumnScope podem ser acessados fora de Row e Column (I3a641).
  • O LayoutFlexible foi renomeado como LayoutWight. O parâmetro restrito foi renomeado como preenchimento (If4738).
  • WithConstraints recebeu o parâmetro LayoutDirection (I6d6f7).
  • Renomeação de Background para DrawBackground. Agora, ele é memorizado por padrão (Ia0bd3).
  • O ButtonStyle foi substituído por funções distintas e a sobrecarga de texto (string) foi removida. Veja amostras atualizadas para informações de uso (If63ab, b/146478620, b/146482131).
  • runOnIdleCompose e runOnUiThread agora são funções globais e não métodos em ComposeTestRule (Icbe8f).

Contribuição externa

  • Remoção de APIs desnecessárias, como Looper e Handler, da camada de portabilidade do Compose Runtime (I6847d).
  • Foi suspenso o uso de Flow<T>.collectAsState() sem valor inicial. Use StateFlow<T> ou transmita um valor inicial explícito (I63f98, b/157674865).