Sobes.tech
Middle

Está familiarizado com o uso do Dagger no desenvolvimento de aplicações Android?

sobes.tech IA

Resposta da IA

Sim, conheço. Dagger é um framework para injeção de dependências (Dependency Injection, DI) em Java e Android, que é compilado durante a construção e permite criar código otimizado, eficiente e fácil de testar.

Os conceitos principais incluem:

  • Módulos (Modules): Fornecem dependências. São anotados com @Module. Dentro do módulo, os métodos com @Provides descrevem como criar uma dependência específica.
    @Module
    public class AppModule {
    
        @Provides
        // fornece o contexto da aplicação
        Context provideAppContext(Application application) {
            return application.getApplicationContext();
        }
    
        @Provides
        // fornece SharedPreferences
        SharedPreferences provideSharedPreferences(Context context) {
            return context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        }
    }
    
  • Componentes (Components): Conectam módulos e injetam dependências. São anotados com @Component. Os componentes são "gráficos de dependências".
    @Singleton
    @Component(modules = {AppModule.class})
    // componente da aplicação
    public interface AppComponent {
    
        // método para injetar na MainActivity
        void inject(MainActivity activity);
    
        // método para obter SharedPreferences do gráfico
        SharedPreferences getSharedPreferences();
    }
    
  • Injeção (Injection): Processo de injetar dependências. Usa @Inject em campos ou construtores.
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        // dependência que Dagger injetará
        SharedPreferences sharedPrefs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Dagger gera código para criar o componente e injetar
            ((MyApplication) getApplication()).getAppComponent().inject(this);
    
            // agora sharedPrefs está disponível
            String value = sharedPrefs.getString("key", "default");
            Log.d("MainActivity", "Valor de SharedPreferences: " + value);
        }
    }
    
  • Escopos (Scopes): Permitem gerenciar o ciclo de vida das dependências. @Singleton para dependências com ciclo de vida da aplicação, anotações personalizadas para escopos mais específicos (por exemplo, @PerActivity).
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    // escopo personalizado para atividades
    public @interface PerActivity {}
    

Dagger também suporta subcomponentes (@Subcomponent) para criar gráficos de dependências menores e hierárquicos, útil em aplicações modulares ou para dependências com ciclo de vida curto (por exemplo, sessões de usuário ou telas específicas).

Principais vantagens do uso do Dagger:

  • Desempenho: A geração de código durante a compilação minimiza os custos em tempo de execução em comparação com frameworks de DI reflexivos.
  • Verificabilidade: O compilador verifica o gráfico de dependências, detectando erros na fase de compilação, não em tempo de execução.
  • Testabilidade: Facilita substituir dependências reais por objetos mock em testes.
  • Legibilidade e manutenção: Descreve explicitamente as dependências dos componentes do sistema.