2014-12-16 3 views
1

대거를 사용하여 내 응용 프로그램에서 종속성 주입을 구현하려고합니다. 모듈 및 발표자에서 내가 api를 주입하려단검 오류 : 정적이 아닌 내부 클래스를 삽입 할 수 없습니다.

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; } 
} 

formatter : 여기 DateScreen

@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") 
       ); 
    } 
} 

추상적이다 : 나는 DayScreen 클래스가 "Simpler Android apps with Flow and Mortar"

설명에 나는 유사한 구조를 가지고 생성자 및 골짜기 필드 주입을 통해 발생하지만 동일한 오류가 발생합니다. error: Can't inject a non-static inner class:...

정적 클래스가 필요한 이유는 누구에게 알 수 있습니까? 위에 언급 한 기사를 부적절하게 만드는 변경 사항이 있습니까?

감사합니다.

답변

1

비 정적 클래스는 인 클로징 인스턴스를 인스턴스화해야합니다. 이로 인해 DI 프레임 워크가 인스턴스화되지 못합니다. 중첩 된 클래스가있는 경우 정적 인 클래스를 만드는 것이 좋습니다.

중첩 클래스가 기본적으로 둘러싸는 인스턴스에 의존하는 경우 리팩토링하여 클래스를 정적으로 만들고 포함하는 클래스의 인스턴스를 가져 오는 명시 적 생성자를 정의해야합니다.

+0

죄송합니다. 컴파일 시간 오류 은 컴파일 타임에 인스턴스화 할 수 없다는 것을 잊어 버렸습니다. 질문에서 언급 한 'AlbumScreen' 클래스를 참조하십시오. 내부 정적 클래스'Module'과'Presenter'가 있습니다. –

+1

컴파일 할 때 클래스가 인스턴스화되지 않습니다. 나는 너를 따라하지 않는다. –

+0

당신은 "비 정적 클래스는 인 클로징 인스턴스를 인스턴스화해야합니다."라고 썼습니다. 그러나 컴파일 타임에 오류가 발생하여 인스턴스가 필요할 수 있습니다. –

관련 문제