2014-12-16 6 views
1

Я пытаюсь реализовать инъекцию зависимостей в моем приложении с помощью кинжала. У меня есть структура, аналогичная структура описан в "Simpler Android apps with Flow and Mortar"Ошибка кинжала: не удается ввести нестатический внутренний класс

У меня есть DayScreen класса:

@Layout(R.layout.day) 
public class DayScreen extends DateScreen { 
    LocalDate date; 

    public DayScreen(LocalDate date) { this.date = date; } 

    @Override public String getMortarScopeName() { return getClass.getName(); } 
    @Override public Object getDaggerModule getModule() { retrun new Module(); } 

@dagger.Module(addsTo = UiModule.class, injects = DayView.class, complete = false, library = true) 
public class Module { 
    @Inject RestService api; 
    @Inject DateTimeFormatter formatter; 

    @Provides @Named("DayScreenDate") LocalDate provideDate(){ 
     return date; 
    } 
} 

@Singleton 
public class Presenter extends ViewPresenter<DayView> { 
    //@Inject RestService api; 
    //@Inject DateTimeFormatter formatter; 
    RestService api; 
    DateTimeFormatter formatter; 

    @Inject Presenter(RestService api, DateTimeFormatter formatter){ 
     this.api = api; 
     this.formatter = formatter; 
    } 

    @Override 
    protected void onLoad(Bundle savedInstanceState) { 
     super.onLoad(savedInstanceState); 
     api.statisticsDay(DayScreen.this.date.format(formatter)) 
       .observeOn(Schedulers.io()) 
       .subscribeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
         resp -> getView().setData(resp.events), 
         err -> Log.e(TAG, err.getLocalizedMessage()), 
         () -> Log.v(TAG, "day stats received") 
       ); 
    } 
} 

Здесь DateScreen является абстрактным:

public abstract class DateScreen implements Blueprint { 
    protected LocalDate date; 

    public DateScreen() { this(LocalDate.now()); } 
    public DateScreen(LocalDate date) { this.date = date; } 

    public LocalDate getDate() { return date; } 
    public void setDate(LocalDate date){ this.date = date; } 
} 

Я попытался придать api и formatter в модуле и в Presenter через инжектор конструктора и впадины, но он испытывает ту же ошибку error: Can't inject a non-static inner class:...

Кто-нибудь знает, зачем нужен статический класс? Существуют ли какие-либо изменения, которые делают статью, о которой упоминается выше, не имеет значения?

Спасибо.

ответ

1

Для нестатических классов требуется экземпляр экземпляра, который будет создан. Это предотвращает создание экземпляра DI. Если у вас есть вложенные классы, то их статичность будет хорошей идеей в любом случае.

Если ваши вложенные классы в основном зависят от экземпляра окружения, то вам придется реорганизовать, чтобы сделать классы статическими и определить явный конструктор с экземпляром окружающего класса.

+0

жаль, что забыл упомянуть, что это ошибка времени компиляции , они не могут быть созданы при компиляции. см. Класс 'AlbumScreen' в статье I, упомянутой в вопросе. Существуют внутренние нестатические классы 'Module' и' Presenter'. –

+1

Во время компиляции классы не создаются. Я не следую за тобой. –

+0

Вы написали: «Нестатические классы требуют экземпляра для экземпляра, который будет создан». Но во время компиляции возникает ошибка, как это может потребовать экземпляр. –