1
resposta

Declaração com ponto

Olá, fiquei com uma dúvida a respeito de uma declaração de uma função em Kotlin.

Não entendi o que quer dizer:

fun transacaoFragment(executa: FragmentTransaction.() -> Unit) {

executa é o que? Uma função? Mas o que seria o ponto após FragmentTransaction? Se executa é uma função, para quê esse ponto no final?

1 resposta

Ola Danilo, boa tarde

Função transacaoFragment: Esta é uma função de nível superior que aceita um único parâmetro chamado executa e não retorna nada (a função retorna Unit, que é o equivalente a void em outras linguagens).

Parâmetro executa: executa é uma função como parâmetro (também conhecida como "função lambda" ou "função de ordem superior"). A assinatura de executa é FragmentTransaction.() -> Unit. FragmentTransaction.() -> Unit Este tipo de declaração é uma função de extensão com um receiver (receptor). Vamos entender isso em partes:

FragmentTransaction: Este é o tipo do receiver. Significa que a função lambda executa será uma extensão do tipo FragmentTransaction. () -> Unit: Indica que executa é uma função que não aceita parâmetros (()) e não retorna nada (Unit).

O que é uma função de extensão com um receiver? Uma função de extensão com um receiver é uma maneira de adicionar novas funcionalidades a uma classe sem modificá-la diretamente. No caso do parâmetro executa, você está declarando uma função que pode ser chamada em uma instância de FragmentTransaction. Dentro do corpo da função lambda, você pode acessar as propriedades e métodos de FragmentTransaction como se fossem membros da lambda.

Exemplo de Uso Vamos ver como isso pode ser utilizado na prática:

fun transacaoFragment(executa: FragmentTransaction.() -> Unit) {
    val transaction = beginTransaction() // Suponha que `beginTransaction` retorne um FragmentTransaction
    transaction.executa() // Aqui estamos chamando a lambda `executa` no contexto de `transaction`
    transaction.commit()
}

Ao chamar transacaoFragment, você pode passar uma lambda que será executada no contexto de um FragmentTransaction:

transacaoFragment {
    add(R.id.fragment_container, MyFragment())
    addToBackStack(null)
}

Benefícios: Limpeza e Legibilidade: Permite que você escreva código mais conciso e expressivo, especialmente útil em DSLs (Domain Specific Languages) em Kotlin. Encapsulamento: Você pode encapsular comportamento específico de uma classe sem a necessidade de modificá-la diretamente.