O que é Kotlin Multiplatform?

Imagine escrever a lógica do seu aplicativo uma única vez e usar esse mesmo código no Android, no iOS, na web e no desktop. Parece bom demais pra ser verdade? Pois é exatamente isso que o Kotlin Multiplatform (KMP) propõe.

Como funciona?

Diferente de frameworks como Flutter ou React Native, que tentam unificar tudo (incluindo a interface), o KMP tem uma abordagem diferente: ele permite compartilhar a lógica de negócio entre plataformas, enquanto a UI continua nativa em cada uma.

Na prática, isso significa:

  • A camada de rede, regras de negócio, válidações e modelos de dados são escritos uma vez em Kotlin
  • A interface do Android usa Jetpack Compose nativo
  • A interface do iOS usa SwiftUI nativo
  • Cada plataforma mantém a experiência que o usuário espera

Arquitetura de um projeto KMP

Pra entender melhor, vamos olhar como um projeto KMP é organizado na prática. A estrutura segue o conceito de source sets, que são conjuntos de código destinados a alvos específicos:

  • commonMain: o código compartilhado entre todas as plataformas. Aqui ficam interfaces, data classes, regras de negócio e tudo que não depende de API nativa
  • androidMain: implementações específicas para Android
  • iosMain: implementações específicas para iOS
  • desktopMain: implementações para JVM desktop (quando aplicável)

O mecanismo de expect/actual é o que conecta tudo. Você declara uma função ou classe com expect no código compartilhado e fornece a implementação com actual em cada plataforma:

// commonMain - declaracao expect
expect fun obterPlataforma(): String

// androidMain - implementacao actual
actual fun obterPlataforma(): String = "Android ${android.os.Build.VERSION.SDK_INT}"

// iosMain - implementacao actual
actual fun obterPlataforma(): String = "iOS ${UIDevice.currentDevice.systemVersion}"

Essa abordagem garante que o código compartilhado permanece independente de plataforma, enquanto cada alvo pode acessar suas APIs nativas quando necessário.

Exemplo de código compartilhado

// Codigo compartilhado (commonMain)
// Roda tanto no Android quanto no iOS
class CalculadoraFrete {
    fun calcular(distanciaKm: Double, pesoKg: Double): Double {
        val taxaBase = 5.0
        val taxaPorKm = 0.50
        val taxaPorKg = 0.30

        return taxaBase + (distanciaKm * taxaPorKm) + (pesoKg * taxaPorKg)
    }

    fun formatarPreco(valor: Double): String {
        return "R$ ${"%.2f".format(valor)}"
    }
}

// Pode ser usado tanto no Android quanto no iOS!
val calculadora = CalculadoraFrete()
val frete = calculadora.calcular(distanciaKm = 150.0, pesoKg = 3.5)
println(calculadora.formatarPreco(frete)) // R$ 81.05

O que dá pra compartilhar?

  • Modelos de dados: classes, enums, data classes
  • Lógica de negócio: cálculos, válidações, regras
  • Camada de rede: chamadas de API com Ktor
  • Persistência local: banco de dados com SQLDelight
  • Gerenciamento de estado: ViewModels compartilhados

E o Compose Multiplatform?

Além de compartilhar a lógica, a JetBrains também desenvolveu o Compose Multiplatform, que leva a API do Jetpack Compose para iOS, desktop e web. Com isso, é possível compartilhar até a interface entre plataformas, se esse for o objetivo do seu projeto.

O Compose Multiplatform utiliza os mesmos conceitos de Composables, State e Modifiers que você já conhece do Jetpack Compose. Se você domina o básico de Compose, a transição é bem suave.

Casos de uso reais

Empresas grandes já adotaram KMP em produção:

  • Netflix: compartilha lógica entre apps mobile
  • Philips: usa KMP em seus produtos de saúde
  • Cash App: um dos primeiros cases de sucesso
  • Forbes, VMware e muitas outras

Além das grandes empresas, startups brasileiras também têm adotado KMP para acelerar o time-to-market. Com uma única equipe escrevendo a lógica de negócio, o custo de desenvolvimento cai drasticamente. Em vez de manter dois times separados (um para Android, outro para iOS), uma equipe menor consegue entregar para ambas as plataformas com qualidade.

Um cenário comum é o de fintechs que precisam garantir que os cálculos financeiros sejam idênticos em todas as plataformas. Com KMP, a lógica de cálculo de juros, taxas e conversões é escrita uma única vez e testada uma única vez, eliminando o risco de divergências entre apps.

KMP vs Flutter vs React Native

AspectoKMPFlutterReact Native
UINativa por padrãoPrópria (Skia)Ponte nativa
LinguagemKotlinDartJavaScript/TS
CompartilhamentoLógica (ou tudo com Compose)TudoTudo
PerformanceNativaQuase nativaVariável

O ecossistema e o futuro do KMP

O ecossistema de bibliotecas para KMP cresceu muito nos últimos anos. Ferramentas como Ktor (cliente HTTP), SQLDelight (banco de dados), Koin (injeção de dependência) e kotlinx.serialization (serialização) já são estáveis e amplamente utilizadas.

O suporte do Gradle para projetos multiplataforma também amadureceu, tornando a configuração mais simples. E com o Google declarando KMP como abordagem recomendada para compartilhamento de lógica em apps Android, a tendência é que o ecossistema cresça ainda mais rápido.

Para quem quer começar, o tutorial de Kotlin Multiplatform do nosso site é um ótimo ponto de partida. E se você já trabalha com Android, o guia de KMP mobile mostra como integrar código compartilhado em um projeto existente.

Vale a pena investir em KMP?

O KMP alcançou estabilidade em 2023 e desde então o ecossistema amadureceu bastante. Se você já programa em Kotlin, entrar no mundo multiplataforma fica muito mais natural. A tendência é que cada vez mais empresas adotem essa tecnologia, e sair na frente nesse conhecimento é um baita diferencial competitivo.

Para aprofundar seus conhecimentos, vale estudar os conceitos de coroutines e Flow, que são a base da programação assíncrona em projetos KMP. O guia completo de coroutines cobre tudo que você precisa saber.