Guia Prático de um Projeto Open Source com Jetpack Compose, MVI, Coroutines e Flow

Estrutura do Projeto e Visão Geral

Este projeto open source é desenvolvido em Kotlin e utiliza o Jetpack Compose para construção da interface, adotando o padrão arquitetural Model-View-Intent (MVI). Para gerenciamento assíncrono, são empergados Coroutines e Flow. A seguir, apresentamos a estrutura de diretórios principal:

├── app                  
│   ├── src
│   │   └── main
│   │       ├── kotlin     
│   │           ├── com.example.demo               
│   │           │   ├── viewmodel                
│   │           │   ├── model                     
│   │           │   ├── interactor                 
│   │           │   └── repository                 
│   │       ├── res                    
│   ├── build.gradle.kts      
│   └── AndroidManifest.xml    
├── README.md             
├── .gitignore            
└── build.gradle.kts      

  • O diretório app contém todo o código-fonte e recursos da aplicação.
  • Dentro de kotlin, os componentes estão organizados por camadas como ViewModels, modelos de dados, lógicas de negócio e repositórios.
  • A pasta res armazena os recursos gráficos e layouts utilizados na interface.

Ponto de Entrada da Aplicação

O ponto inicial da execução se dá no arquivo MainActivity.kt, localizado em app/src/main/kotlin/com/example/demo/ui/MainActivity.kt. Este arquivo inicializa o ambiente do Jetpack Compose e conecta o ciclo de vida da UI ao ViewModel seguindo o padrão MVI.

package com.example.demo.ui

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.lifecycle.ViewModelProvider
import com.example.demo.viewmodel.AppStateViewModel
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    private lateinit var stateHandler: AppStateViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setupDependencies()
        stateHandler = ViewModelProvider(this)[AppStateViewModel::class.java]
        setContent {
            AppContent(viewModel = stateHandler)
        }
    }

    private fun setupDependencies() {
        // Inicialização de dependências via DI framework
    }
}

A função AppContent representa a raiz da hierarquia de composição declarativa e é responsável por refeltir mudanças de estado vindas do ViewModel.

Arquivo de Configuração do Módulo

No arquivo app/build.gradle.kts, encontram-se as configurações essenciais para compilação do módulo, incluindo plugins, versões do SDK, opções do compilador Kotlin e dependências externas.

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-kapt")
}

android {
    compileSdk = 33
    defaultConfig {
        applicationId = "com.example.demo"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }

    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.0"
    }
}

dependencies {
    val composeBom = platform("androidx.compose:compose-bom:2023.06.01")
    implementation(composeBom)
    implementation("androidx.compose.material3:material3")
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48")
}

Essas definições garantem que o ambiante esteja preparado para trabalhar com Jetpack Compose, Dagger Hilt e outras bibliotecas fundamentais para a implementação da arquitetura proposta.

Tags: jetpack-compose mvi Kotlin coroutines flow

Publicado em 10-7 23:24