Instruções Gerais:

  • Resolva as atividades em ordem progressiva de maturidade.
  • Cada nível adiciona requisitos técnicos, tratamento de erros e casos de borda reais.
  • Consulte o gabarito comentado ao final de cada questão para autoavaliação.

🎯 Nível 1: Fundamentos

Problema 12.1 — Configuração de Módulos Koin com single e factory

Contexto: Configuração de Módulos Koin com single e factory no contexto de Injeção de Dependências com Koin / Hilt no Android.

Requisitos de Execução:

  1. Declarar módulo Koin injetando Repositorio como singleton e UseCase como factory.

Resultado Esperado

Módulo de injeção Koin configurado de forma declarativa.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_1_SeuNome
  2. Envie na tarefa: Atividade Cap 12 - Injeção de Dependências com Koin / Hilt no Android
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.di

import org.koin.dsl.module

class RepositorioRemoto
class ConsultarExtratoUseCase(val repo: RepositorioRemoto)

val appModule = module {
    single { RepositorioRemoto() }
    factory { ConsultarExtratoUseCase(get()) }
}

🔍 Nível 2: Prática

Problema 12.2 — Injeção de ViewModel com koinViewModel() no Compose

Contexto: Injeção de ViewModel com koinViewModel() no Compose no contexto de Injeção de Dependências com Koin / Hilt no Android.

Requisitos de Execução:

  1. Injetar ViewModel diretamente no @Composable utilizando a extensão koinViewModel().

Resultado Esperado

ViewModel resolvido pelo container de DI sem acoplamento direto.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_2_SeuNome
  2. Envie na tarefa: Atividade Cap 12 - Injeção de Dependências com Koin / Hilt no Android
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.ui

import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import org.koin.androidx.compose.koinViewModel
import com.empresa.mobile.viewmodel.ContadorViewModel

@Composable
fun TelaComKoin(viewModel: ContadorViewModel = koinViewModel()) {
    Text("ViewModel injetado via Koin com ciclo de vida gerenciado.")
}

⚡ Nível 3: Integração

Problema 12.3 — Injeção de Dependências com Hilt (@HiltAndroidApp, @Inject)

Contexto: Injeção de Dependências com Hilt (@HiltAndroidApp, @Inject) no contexto de Injeção de Dependências com Koin / Hilt no Android.

Requisitos de Execução:

  1. Configurar classe Application com @HiltAndroidApp e injetar serviços no ViewModel com @HiltViewModel.

Resultado Esperado

Hilt configurado para geração estática de grafo de injeção em compilação.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_3_SeuNome
  2. Envie na tarefa: Atividade Cap 12 - Injeção de Dependências com Koin / Hilt no Android
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.di

import android.app.Application
import androidx.lifecycle.ViewModel
import dagger.hilt.android.HiltAndroidApp
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltAndroidApp
class EmpresaMobileApp : Application()

@HiltViewModel
class PedidosViewModel @Inject constructor(
    private val repo: RepositorioRemoto
) : ViewModel()

🏆 Nível 4: Desafio Corporativo

Problema 12.4 — Qualificadores e Ambientes Mock para Testes de Integração

Contexto: Qualificadores e Ambientes Mock para Testes de Integração no contexto de Injeção de Dependências com Koin / Hilt no Android.

Requisitos de Execução:

  1. Utilizar @Named ou Qualifiers customizados para alternar entre serviço real e mock em tempo de teste.

Resultado Esperado

Grafo de dependências modularizado permitindo troca de implementações em testes.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_4_SeuNome
  2. Envie na tarefa: Atividade Cap 12 - Injeção de Dependências com Koin / Hilt no Android
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.di

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Named
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object RedeModule {
    @Provides
    @Singleton
    @Named("ProdApi")
    fun provideProdUrl(): String = "https://api.empresa.com"

    @Provides
    @Singleton
    @Named("MockApi")
    fun provideMockUrl(): String = "https://mock.empresa.com"
}

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos