2016-10-19 4 views
2

Mein Modul arbeitet:Dagger 2 - mehrere Objekte gleichen Typs Injektion @Named mit nicht

@Module 
public class TcpManagerModule { 
    private ITcpConnection eventsTcpConnection; 
    private ITcpConnection commandsTcpConnection; 

    public TcpManagerModule(Context context) { 
     eventsTcpConnection = new EventsTcpConnection(context); 
     commandsTcpConnection = new CommandsTcpConnection(context); 
    } 

    @Provides 
    @Named("events") 
    public ITcpConnection provideEventsTcpConnection() { 
     return eventsTcpConnection; 
    } 

    @Provides 
    @Named("commands") 
    public ITcpConnection provideCommandsTcpConnection() { 
     return commandsTcpConnection; 
    } 
} 

Komponente:

@Component(modules = TcpManagerModule.class) 
public interface TcpManagerComponent { 
    void inject(ITcpManager tcpManager); 
} 

Klasse, wo Injektion geschieht:

public class DefaultTcpManager implements ITcpManager { 
    private TcpManagerComponent tcpComponent; 

    @Inject @Named("events") ITcpConnection eventsTcpConnection; 

    @Inject @Named("commands") ITcpConnection commandsTcpConnection; 

    public DefaultTcpManager(Context context){ 
     tcpComponent = DaggerTcpManagerComponent.builder().tcpManagerModule(new TcpManagerModule(context)).build(); 
     tcpComponent.inject(this); 
    } 

    @Override 
    public void startEventsConnection() { 
     eventsTcpConnection.startListener(); 
     eventsTcpConnection.connect(); 
    } 
} 

Wenn ich startEventsConnection aufrufen, bekomme ich NullPointerException - was bedeutet, dass die Injektion die Felder nicht gefüllt hat.

Ich folgte dem Beispiel genau so wie es auf dem Docs ist, was ist das Problem?

Hinweis: auf der Builder Linie

tcpComponent = DaggerTcpManagerComponent.builder().tcpManagerModule(new TcpManagerModule(context)).build(); 

Ich habe eine Warnung sagen "tcpManagerModule ist veraltet". Ich lese die Antwort here über dieses Problem, und sein Sprichwort

Es ist sicher zu sagen, dass Sie einfach ignorieren können die Vernachlässigung. Es soll Sie über nicht verwendete Methoden und Module informieren. Sobald Sie die Anwendung irgendwo im Untergraphen benötigen/verwenden, wird das Modul benötigt und die Verwarnungswarnung verschwindet.

Also, benötige ich nicht/verwende die Instanzen? Was ist das Problem hier?

Antwort

2

Sie könnten versuchen, Ihre Component Definition der spezifischen Klasse für die Injektion zu ändern:

@Component(modules = TcpManagerModule.class) 
public interface TcpManagerComponent { 
    void inject(DefaultTcpManager tcpManager); 
} 

Damit Dolch weiß genau über DefaultTcpManager.class.

+0

genau was ich brauchte. Vielen Dank –