我的模块:
@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及其说法
可以肯定地说,您可以忽略弃用。它旨在通知您未使用的方法和模块。一旦你在子图中的某个地方实际需要/使用应用程序,就会需要使用该模块,并且弃用警告将会消失。
那么,我不需要/使用实例吗?这是什么问题?
答案 0 :(得分:2)
您可以尝试更改定义特定注射类的Component
:
@Component(modules = TcpManagerModule.class)
public interface TcpManagerComponent {
void inject(DefaultTcpManager tcpManager);
}
所以Dagger确切地知道DefaultTcpManager.class
。