2016-10-19 7 views
2

Мой модуль:Dagger 2 - инъекционные несколько объектов одного типа с использованием @Named не работает

@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; 
    } 
} 

Компонент:

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

класс, где впрыск происходит:

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(); 
    } 
} 

Когда я звоню startEventsConnection, я получаю NullPointerException - это означает, что инъекция не заполнила поля.

Я следовал примеру именно так, как это делается в Документах, в чем проблема?

Примечание: на строитель линии

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

У меня есть предупреждение о том, "tcpManagerModule устарела". Я прочитал ответ here об этом выпуске, и его высказывание

Можно с уверенностью сказать, что вы можете просто игнорировать устаревание. Он предназначен для уведомления вас о неиспользуемых методах и модулях. Как только вы на самом деле потребуете/используете приложение где-то на вашем подграфе, модуль понадобится, и предупреждение об устаревании исчезнет.

Итак, я не требую/использования экземпляров? В чем проблема?

ответ

2

Вы могли бы попробуйте изменить Component определение конкретного класса для инъекций:

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

Так что Dagger точно знает о DefaultTcpManager.class.

+0

именно то, что мне нужно. благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^