Modo forte para pular

O modo de pular forte é um modo disponível no compilador do Compose. Quando ativada, ela muda o comportamento do compilador de duas maneiras:

  • Elementos combináveis com parâmetros instáveis se tornam puláveis
  • Lambdas com capturas instáveis são lembradas (link em inglês)
.

Ativar o modo de rejeição avançada

Para ativar a opção de pular forte para um módulo do Gradle, inclua a seguinte opção em no bloco composeCompiler da configuração do Gradle:

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

Recurso combinável para pular

O modo de pular forte alivia algumas das regras de estabilidade normalmente aplicadas. pelo compilador do Compose quando se trata de pular e de funções combináveis. De padrão, o compilador do Compose marcará uma função combinável como pulável se todas as seus argumentos têm valores estáveis. O modo de pular forte muda isso.

Com esse recurso ativado, todas as funções combináveis que podem ser reiniciadas se tornam (puláveis). Isso acontece com parâmetros instáveis ou não. As funções combináveis não reiniciáveis não podem ser puladas.

Quando pular

Para determinar se um elemento combinável precisa ser ignorado durante a recomposição, o Compose compara o valor de cada parâmetro pelos valores anteriores. O tipo de comparação depende da estabilidade do parâmetro.

  • Os parâmetros instáveis são comparados usando a igualdade de instância (===)
  • Os parâmetros estáveis são comparados usando a igualdade de objetos (Object.equals())

Se todos os parâmetros atenderem a esses requisitos, o Compose vai pular o elemento combinável durante recomposição.

Você pode querer que um elemento combinável desative a opção "Pular forte". Ou seja, é possível quer um elemento combinável reinicializável, mas não pulável. Nesse caso, use o método @NonSkippableComposable.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

Anotar classes como estáveis

Se você quiser que um objeto use a igualdade de objetos em vez da igualdade de instâncias, continuar a anotar a classe especificada com @Stable. Um exemplo de quando você pode ter que fazer isso é ao observar uma lista inteira de objetos, fontes de dados como porque o Room vai alocar novos objetos para cada item na lista sempre que um as mudanças.

Memoização lambda

O modo de pular forte também permite mais memoização de lambdas. dentro de elementos combináveis. Com o salto forte ativado, todos os lambdas dentro de uma função combinável será lembrada automaticamente.

Exemplos

Para conseguir a memorização de lambdas dentro de elementos combináveis ao usar o recurso "pular forte", o compilador encapsula seu lambda com uma chamada de remember. Ele é codificado com o capturas da lambda.

Considere um caso em que você tem uma lambda, como no exemplo abaixo:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

Com o salto forte ativado, o compilador memoriza a lambda ao envolvê-la. uma chamada remember:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

As chaves seguem as mesmas regras de comparação que as funções combináveis. Ambiente de execução compara chaves instáveis usando a igualdade de instância. Ele compara chaves estáveis usando igualdade de objetos.

Memoização e recomposição

Essa otimização aumenta muito o número de elementos combináveis que o ambiente de execução pula durante a recomposição. Sem a memorização, o tempo de execução é muito mais provável para alocar uma nova lambda a qualquer elemento combinável que use um parâmetro lambda durante recomposição. Como resultado, a nova lambda tem parâmetros que não são iguais a a última composição. Isso resulta em recomposição.

Evitar a memorização

Se você não quiser armazenar um lambda, use o @DontMemoize. uma anotação.

val lambda = @DontMemoize {
    ...
}

Tamanho do APK

Quando compilados, os elementos combináveis puláveis resultam em mais código gerado do que combináveis que não são puláveis. Com o salto forte ativado, o compilador marca quase todos os elementos combináveis como puláveis e envolve todos os lambdas em um remember{...}: Por isso, a ativação do modo de pulo forte tem um no tamanho do APK do seu app.

A ativação do recurso "Pular" forte no Now in Android aumentou o APK. em 4 KB. A diferença de tamanho depende muito do número elementos combináveis não puláveis que estavam presentes no app em questão, mas deveriam ser relativamente menores.