jjzjj

android - Dagger 2 - 在实现类中注入(inject)接口(interface) - "Attempt to invoke interface method on a null object reference"

coder 2023-12-10 原文

当我试图在实现类中注入(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 .

  1. @Inject注释它的构造函数并更改 providesLoginManager(Context)

    @Provides @Singleton
    LoginManager providesLoginManager(LoginManagerImpl manager) {
      return manager;
    }
    

    这意味着 Dagger 将提供 LoginManagerImpl ,还有你的 @Provides方法绑定(bind) LoginManager

  2. 如果要实例化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/

有关android - Dagger 2 - 在实现类中注入(inject)接口(interface) - "Attempt to invoke interface method on a null object reference"的更多相关文章

随机推荐