Flow para Kotlin: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução ao Flow: o que é e para que serve?

\n\n

Flow é uma biblioteca para trabalhar com fluxos de dados reativos (reactive streams) na linguagem de programação Kotlin. Ela faz parte do ecossistema Kotlin Coroutines e fornece uma maneira poderosa, type-safe e assíncrona de processar sequências de dados que são geradas ao longo do tempo.

\n\n

Ao contrário das coleções comuns (List, Set), que armazenam todos os elementos na memória de uma só vez, o Flow é um fluxo frio (cold stream). Isso significa que os dados começam a ser gerados apenas quando um assinante (collector) aparece. O Flow é ideal para:

\n
    \n
  • Processamento assíncrono de dados: Obter dados da rede, banco de dados ou sistema de arquivos sem bloquear a thread principal.
  • \n
  • Processamento de eventos: Cliques, movimentos do mouse, atualizações de UI.
  • \n
  • Programação reativa: Criar cadeias de transformações de dados (map, filter, flatMap) com tratamento automático de erros e cancelamento.
  • \n
  • Integração com corrotinas: O Flow é totalmente compatível com Kotlin Coroutines, permitindo combiná-lo facilmente com outras operações assíncronas.
  • \n
\n\n

Por que usar Flow em vez de abordagens antigas (como RxJava ou callbacks)?

\n
    \n
  • Simplicidade e concisão: A API do Flow é minimalista e intuitiva para desenvolvedores Kotlin.
  • \n
  • Segurança: Type-safe em nível de compilador.
  • \n
  • Integração com corrotinas: Usa todas as vantagens da concorrência estruturada (structured concurrency).
  • \n
  • Desempenho: Leve e eficiente, não cria objetos desnecessários.
  • \n
\n\n

Instalação do Flow

\n\n

O Flow faz parte da biblioteca kotlinx.coroutines. Para usá-lo, você precisa adicionar a dependência ao seu arquivo build.gradle.kts (para Gradle) ou pom.xml (para Maven).

\n\n

Gradle (Kotlin DSL)

\n
dependencies {\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")\n    // Para usar Flow no Android (com suporte a Lifecycle)\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")\n}
\n\n

Gradle (Groovy)

\n
dependencies {\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1'\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'\n}
\n\n

Maven

\n
\n    org.jetbrains.kotlinx\n    kotlinx-coroutines-core\n    1.8.1\n
\n\n

Importante: Certifique-se de que a versão do Kotlin e a versão do kotlinx-coroutines sejam compatíveis. A versão atual pode ser encontrada no GitHub.

\n\n

Início rápido: primeiro Flow

\n\n

Vamos criar um Flow simples que emite três números com um atraso e nos inscrevemos nele.

\n\n
import kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\n\nfun simpleFlow(): Flow<Int> = flow {\n    println("Flow iniciado")\n    for (i in 1..3) {\n        delay(100) // Simula trabalho assíncrono\n        emit(i)    // Emite o valor\n    }\n}\n\nfun main() = runBlocking {\n    println("Thread principal: ${Thread.currentThread().name}")\n\n    // Inscreve-se no Flow (coleta os dados)\n    simpleFlow().collect { value ->\n        println("Recebido: $value")\n    }\n\n    println("Flow concluído")\n}
\n\n

Saída:

\n
Thread principal: main\nFlow iniciado\nRecebido: 1\nRecebido: 2\nRecebido: 3\nFlow concluído
\n\n

Explicação

Recommendations