2016-04-09 9 views
41

Ho iniziato a utilizzare dagger 2.2 e i metodi del modulo nel builder Component sono obsoleti.Metodo del modulo builder componente Dagger 2.2 deprecato

Questo è il mio componente Application:

@Component(modules = ApplicationModule.class) 
public interface ApplicationComponent { 
    void inject(Application application); 
} 

e il modulo di applicazione:

@Module 
public class ApplicationModule { 
    Application application; 

    public ApplicationModule(Application application) { 
     this.application = application; 
    } 

    @Provides 
    @Singleton 
    Application providesApplication() { 
     return application; 
    } 
} 

Ecco la classe generata:

@Generated(
    value = "dagger.internal.codegen.ComponentProcessor", 
    comments = "https://google.github.io/dagger" 
) 
public final class DaggerApplicationComponent implements ApplicationComponent { 
    private DaggerApplicationComponent(Builder builder) { 
    assert builder != null; 
    } 

    public static Builder builder() { 
    return new Builder(); 
    } 

    public static ApplicationComponent create() { 
    return builder().build(); 
    } 

    @Override 
    public void inject(Application application) { 
    MembersInjectors.<Application>noOp().injectMembers(application); 
    } 

    public static final class Builder { 
    private Builder() {} 

    public ApplicationComponent build() { 
     return new DaggerApplicationComponent(this); 
    } 

    /** 
    * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules. 
    */ 
    @Deprecated 
    public Builder applicationModule(ApplicationModule applicationModule) { 
     Preconditions.checkNotNull(applicationModule); 
     return this; 
    } 
    } 
} 

Come posso inizializzare il componente se non con ComponentBuilder?

risposta

104

Si consiglia di leggere la descrizione di perché è deprecato.Se si utilizza un IDE come IntelliJ o Android Studio, è sufficiente selezionare il metodo e premere Controllo + Q su Windows per leggere Javadoc incluso l'avviso di rimozione.

Il Javadoc legge:

@deprecated Questo modulo è dichiarato, ma un'istanza non viene usato nel gruppo. Questo metodo è un no-op. Per ulteriori informazioni, vedere https://google.github.io/dagger/unused-modules.

E da questo link è possibile vedere:

Quando il processore Pugnale genera componenti, richiede solo le istanze di moduli e le dipendenze dei componenti che sono esplicitamente necessari per fornire le richieste di un legame.

  • Se tutti i metodi di un modulo utilizzati nel componente sono statici, Dagger non ha bisogno di un'istanza di quel modulo. Dagger può invocare i metodi statici direttamente senza un modulo.
  • Se un modulo non fornisce collegamenti per un componente, non è necessaria alcuna istanza di quel modulo per costruire il grafico.

E 'sicuro di dire che si può semplicemente ignorare la deprecazione. Ha lo scopo di notificare all'utente metodi e moduli non utilizzati. Non appena è effettivamente necessario/utilizzare Application da qualche parte nel sottografo, il modulo sarà necessario e l'avviso di ritiro scomparirà.

+26

risposta Scan, Command + Q colpito, Android Studio si spegne . Attiva il cervello, torna indietro, leggi di nuovo la risposta. – Bri6ko

+1

Ctrl + J a proposito. Il Ctrl + Q è un tentativo di trolling. – StarWind0

+1

@StarWind Nessuna intenzione di pesca alla traina, questa è la scorciatoia di Windows;) –

3

Ho lo stesso problema con l'ospite e voglio solo ognuno di noi ha problema deprecato il generato classe costruttore componente dovrebbe verificare due cose per risparmiare tempo:

1/sintassi pugnale corretta per il modulo, componente di controllare anche con attenzione dove iniettare.

2/Deve disporre di un oggetto di iniezione (inserire l'annotazione e il relativo oggetto) sul posto che si desidera iniettare, altrimenti il ​​compilatore di dagger non può vedere dove utilizzare il modulo, quindi alcuni metodi saranno deprecati.Basta iniettare almeno un modulo della fornisce al vostro posto di iniezione e ri-compilare il codice, non avrete più quel problema :)

9

Essa mostra deprecato, perché non si utilizza componenti e il modulo nell'applicazione da

@Inject 
SomeObjectFromModule mSomeObject 

se non si sta iniettando dipendenze nelle applicazioni non v'è alcun uso di inizializzazione componente in modo pugnale cercare almeno un utilizzo

una volta aggiunto queste righe in tutte le classi che si desidera iniettare vista e costruire quindi pulire e ricostruisci il progetto e la tua deprecazione sarà risolta

+1

Dovrebbe essere la risposta accettata. Inoltre, non dimenticare di "Ricostruisci il tuo progetto" dopo l'iniezione. – sokarcreative

+1

Questo è molto più chiaro della risposta accettata! – Rainmaker

2

Segnala errore quando il mio Module non ha il metodo @Provides o l'oggetto fornito da Dagger non viene utilizzato nell'app.
Esempio per rimuovere il modulo deprecato

modulo

@Module 
public class SecondActivityModule { 
    @Provides 
    Book provideBookTest() { 
     return new Book(); 
    } 
} 

Attività

public class SecondActivity extends AppCompatActivity { 
    @Inject 
    Book test; 
    ... 
} 

O in Componente

@Component(modules = SecondModule.class) 
public interface SecondComponent { 

    void inject(SecondActivity activity); 

    Book getBookTest(); 
} 
Problemi correlati