Compose Runtime
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(Consulte os documentos de referência da API para todos os pacotes do Compose)
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.
Grupo | Descrição |
---|---|
compose.animation | Crie animações nos aplicativos Jetpack Compose para enriquecer a experiência do usuário. |
compose.compiler | Transforme funções de @composição e ative otimizações com um plug-in do compilador Kotlin. |
compose.foundation | Crie 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.material | Crie 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.material3 | Crie 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.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. |
compose.ui | Componentes 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.
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 aCompositionData
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 peloRecomposer.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 Kotlin1.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 AGP7.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óriosrc/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 usaradb 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 caracteresH
,S
eP
, 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 classeandroidx.compose.runtime.SlotTable
teria um descritor deLandroidx/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étodofun isPlaced(): Boolean
emLayoutNode
tem a assinaturaisPlaced()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 oComposeNode
(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âmetrocount
. 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. ChamarwithFrameNanos
ouRecomposer.runRecomposeAndApplyChanges
semMonotonicFrameClock
agora gerará umaIllegalStateException
(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
paracompositionLocalOf
estaticCompositionLocalOf
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 deselected
eonClick
. - O parâmetro
alwaysShowLabels
em BottomNavigationItem foi renomeado comoalwaysShowLabel
. - Os parâmetros
bodyContent
em alguns componentes foram renomeados comocontent
. - 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
adarkColors()
. Essa cor costuma ser a mesma quesecondary
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
emSlider
foi renomeado comoonValueChangeFinished
e transformado em anulável.- O parâmetro
text
emSnackbar
foi renomeado comocontent
para manter a consistência. - Adição do parâmetro
contentPadding
aDropdownMenuItem
para permitir a personalização do padding padrão. Além disso,content
passou a ser uma extensão emRowScope
. - Renomeação de
ModalDrawerLayout
comoModalDrawer
. - Renomeação de
BottomDrawerLayout
comoBottomDrawer
- (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
ewithMutableSnapshot
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 deCompositionLifecycleObserver
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 queonEnter
é chamado apenas uma vez.onEnter
era chamado várias vezes se o objeto fosse usado em subcomposições, comoWithConstraints
eScaffold
, tornando a única garantia de chamada deonEnter
não confiável, e foi removido paraRememberObserver
.RememberObserver
adicionaonAbandoned
, que é chamado se a instância deRememberObserver
é retornada do callback transmitido pararemember
, mas não é lembrada no estado de composição e, portanto, nunca terá a chamada deonRemembered
. 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 deRememberObserver
após a recomendação de referência única acima estiver acompanhando um recurso externo,onForgotten
eonAbandoned
indicam que o recurso não é mais necessário. Se o objeto estiver rastreando o trabalho iniciado ou os recursos alocados emonRemembered
,onAbandoned
poderá ser ignorado, porque ele não será chamado seonRemembered
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 comoinsertTopDown()
.Um novo método,
insertBottomUp()
, foi adicionado.Uma Applier insere nós na árvore que está editando com
insertTopDown()
ouinsertBottomUp()
, dependendo de qual apresenta melhor desempenho.Algumas árvores, como
LayoutNode
eView
, 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, umApplier
substitui uminsertBottomUp()
para criar uma árvore de baixo para cima, einsertTopDown()
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
- AndroidOwner agora é interno (Ibcad0, b/170296980).
- subcomposeInto(LayoutNode) agora é interno (Id724a).
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 paracontent
, 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 aruntime-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 maisMonotonicFrameClock
. Os autores de chamadas dewithFrameNanos
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
ouwaitForIdle
, 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
ewithMutableSnapshot
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 pararemember { 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ãoby 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. UseAndroidView
, 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()
esavedInstanceStateOf()
foi mudada parastructuralEqualityPolicy()
em vez dereferentialEqualityPolicy()
.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()
esavedInstanceStateOf()
usammutableStateOf()
nas implementações deles, então eles foram mudados para que haja consistência commutableStateOf()
.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 dostate
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 classesdata
, podem ter uma degradação no desempenho, porque os métodosequals()
agora são, por padrão, chamados quando atribuídos a ummutableStateOf()
.O comportamento anterior pode ser restaurado adicionando o parâmetro de política
policy = referentialEqualityPolicy()
às chamadas paramutableStateOf()
,ambientOf()
esavedInstanceStateOf()
(Ic21a7).Row
eColumn
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 propriedadesval
de uma classe de dados, usestate
em vez deremember
e atribua o valor do estado a cópias clonadas do original usando o método de conveniênciacopy(...)
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 propriedadesvar
da classe original porvar
commutableStateOf
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:
- Algumas chamadas serão ignoradas.
- 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ãovararg
daqui em diante. 5. A anotação Pivotal foi suspensa. Usekey
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
eStableMutableMap
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
eSnapshotStateMap
agora são públicos, mas ficarão obsoletos depois queStableMutableList
eStableMutableMap
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 { ... }
ouby 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
ousetViewContent
. O uso de Compose.disposeComposition foi descontinuado. Use o métododispose
noComposition
retornado pelosetContent
. 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 paratrue
, 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 comorunOnIdle
(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
erunOnUiThread
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. UseStateFlow<T>
ou transmita um valor inicial explícito (I63f98, b/157674865).