2014-12-14 7 views
0

Я использую MVP в android. Я использую кинжал и по какой-то неизвестной причине, или из-за недостатка знаний, не вводят в другой класс.Нужно делать вложенные инъекции кинжалом

У меня есть этот модуль:

@Module(
     injects = { 
       LoginActivity.class, 
     }, 
     library = true, 
     complete = false 
) 
public class LoginModule { 
    private LoginActivity loginActivity; 

    public LoginModule(LoginActivity loginActivity) { 
     this.loginActivity = loginActivity; 
    } 

    @Provides 
    @Singleton 
    LoginPresenter provideLoginPresenter() { 
     return new LoginPresenterImpl(loginActivity); 
    } 

    @Provides @Singleton 
    public UrlService provideUrlService(){ 
     return new UrlServiceImpl(); 
    } 

} 

Эта активность:

public class LoginActivity extends BaseActivity implements LoginView { 
    @Inject 
    public LoginPresenter loginPresenter; 
    @Inject 
    UrlService urlService; 
    //... 
    @Override 
    protected List<Object> getModules() { 
     List<Object> modules = new LinkedList<Object>(); 
     modules.add(new LoginModule(this)); 
     return modules; 
    } 
    //... 
    //I use butterknife too 
    @Optional 
    @OnClick(R.id.btn_login_accept) 
    public void testButtonOnClick() { 
     disableAccept(); 
     writeLog(urlService.getLoginUrl()); //This UrlService works fine. 
     loginPresenter.login();    //And login presenter works too. 

    } 

и этот код инъекции LoginPresenter где UrlService она возвращает NullPointerException

public class LoginPresenterImpl extends BasePresenterImpl<LoginView> 
        implements LoginPresenter { 
    @Inject 
    public LoginPresenterImpl(LoginView view) { 
     super(view); 
    } 

    @Inject 
    public UrlService urlService; 

    @Override 
    public void login() { 
     view.showShortMessage(urlService.getLoginUrl());//throws nullpointerexception 

Пожалуйста, кто-то может мне помочь?

заранее спасибо

+0

Вы не указали свой метод 'onCreate()', я предполагаю, что вы вызываете 'inject (this)' как часть этого, хотя? –

ответ

0

В дополнении к моему другому ответу, этот ответ использует другой подход, а именно, позволяя Dagger создать экземпляр класса LoginPresenter:

public class LoginPresenterImpl extends BasePresenterImpl<LoginView> 
        implements LoginPresenter { 

    private UrlService urlService; 

    @Inject 
    public LoginPresenterImpl(LoginView view, UrlService urlService) { 
     super(view); 
     this.urlService = urlService; 
    } 

    @Override 
    public void login() { 
     view.showShortMessage(urlService.getLoginUrl()); 
    } 
} 

Изменить модуль:

@Provides 
@Singleton 
public UrlService provideUrlService(){ 
    return new UrlServiceImpl(); 
} 

@Provides 
public LoginView provideLoginView() { 
    return loginActivity; 
} 

@Provides 
@Singleton 
LoginPresenter provideLoginPresenter(LoginPresenterImp loginPresenter) { 
    return loginPresenter; 
} 

Обратите внимание, что теперь вы do требуется @Inject аннотация для вашего LoginPresenterImpl конструктор.

+0

Спасибо за ответ. это прекрасно работает –

0

Вы никогда не вводить свой UrlService экземпляр в вашу LoginPresenterImpl.

The (возможно) лучший способ решить проблему будет поставлять его в конструктор, как это:

public class LoginPresenterImpl extends BasePresenterImpl<LoginView> 
        implements LoginPresenter { 

    private UrlService urlService; 

    public LoginPresenterImpl(LoginView view, UrlService urlService) { 
     super(view); 
     this.urlService = urlService; 
    } 

    @Override 
    public void login() { 
     view.showShortMessage(urlService.getLoginUrl()); 
    } 
} 

Затем измените модуль:

@Provides 
@Singleton 
LoginPresenter provideLoginPresenter(UrlService urlService) { 
    return new LoginPresenterImpl(loginActivity, urlService); 
} 

Обратите внимание, что вы не делаете вам понадобится аннотация @Inject на вашем конструкторе LoginPresenterImpl, поскольку вы создаете его сами.

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