当我试图在实现类中注入(inject)接口(interface)时,我总是得到空指针异常。这是我的代码:
获得:
Nullpointer error in LoginManagerImpl class at line:
@Override
public String getLoginResponse(String request) {
return networkManager.getLoginResponse(request);
}
此处networkManager 始终为空,请您查看代码。
下面是我的源代码:
public class LoginActivity extends Activity {
@Inject
NetworkManager networkManager;
@Inject
LoginManager loginManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getApplicationComponent().inject(this);
loginManager.getLoginResponse("valid Login Request");
}
}
public interface NetworkManager
{
String getLoginResponse(String request);
String getUserDetailResponse(String request);
String getABCResponse(String request);
}
public interface LoginManager
{
String getLoginResponse(String request);
}
public class LoginManagerImpl implements LoginManager {
@Inject
NetworkManager networkManager;
public LoginManagerImpl(Context context)
{
}
@Override
public String getLoginResponse(String request) {
return networkManager.getLoginResponse(request);
}
}
public class NetworkManagerImpl implements NetworkManager {
public NetworkManagerImpl(Context context)
{
}
@Override
public String getLoginResponse(String request) {
return "valid login response fetched from server";
}
@Override
public String getUserDetailResponse(String request) {
return "valid user deails";
}
@Override
public String getABCResponse(String request) {
return "valid ABC request response";
}
}
@Module
public class AppModule {
DaggerApplication application;
public AppModule(DaggerApplication application) {
this.application = application;
}
@Provides
@Singleton
DaggerApplication provideDaggerApplication() {
return application;
}
@Provides
@Singleton
public Context provideApplicationContext()
{
return application.getApplicationContext();
}
@Provides
@Singleton
public LoginManager providesLoginManager(Context context)
{
return new LoginManagerImpl();
}
@Provides
@Singleton
public LoyaltyCardManager providesLoyaltyCardManager(Context context)
{
return new LoyaltyCardManagerImpl(context);
}
@Provides
@Singleton
public NetworkManager providesNetworkManager(Context context)
{
return new NetworkManagerImpl(context);
}
}
@Singleton
@Component(
modules = {
com.dagger.component.AppModule.class
})
public interface ApplicationComponent {
void inject (LoginActivity activity);
NetworkManager getNetworkManager();
LoginManager getLoginManager();
}
最佳答案
有两种方法可以让 Dagger 注入(inject)依赖项,例如 networkManager场成LoginManagerImpl .
用@Inject注释它的构造函数并更改 providesLoginManager(Context)到
@Provides @Singleton
LoginManager providesLoginManager(LoginManagerImpl manager) {
return manager;
}
这意味着 Dagger 将提供 LoginManagerImpl ,还有你的 @Provides方法绑定(bind) LoginManager
如果要实例化LoginManagerImpl你自己在 providesLoginManager(Context) , 然后还请求 MembersInjector<LoginManagerImpl>并用它来注入(inject)像networkManager这样的字段:
@Provides @Singleton
LoginManager providesLoginManager(Context context, MembersInjector<LoginManagerImpl> membersInjector) {
LoginManagerImpl manager = new LoginManagerImpl(context);
membersInjector.injectMembers(manager);
return manager;
}
对于您的示例,我推荐选项 #1。使用 MembersInjector对于不能让 Dagger 实例化的类非常有用,例如 Android Activity。
关于android - Dagger 2 - 在实现类中注入(inject)接口(interface) - "Attempt to invoke interface method on a null object reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080437/