2014-10-30 3 views
4

Flow을 사용하여 화면에서 결과를 반환하는 방법을 찾고 있는데, 이전 화면에서 작성한 것을 잃지 않고 onActivityResult와 비슷합니다. 예를 들어 새 문서를 만드는 화면은 다음과 같습니다.박격포 및 유동에 대해 onActivityResult와 동일합니까?

@Layout(R.layout.new_document_view) 
class NewDocumentScreen implements Blueprint { 

    // Imagine some Blueprint boiler plate here 

    static class Presenter implements ViewPresenter<NewDocumentView> { 
    private final Flow flow; 

    private Document newDocument = new Document(); 

    @Inject Presenter(Flow flow) { this.flow = flow; } 

    @Override protected void onLoad(Bundle savedInstanceState) { 
     super.onLoad(savedInstanceState); 

     NewDocumentView view = getView(); 
     if (view == null) return; 

     view.bindTo(newDocument); // immediately reflect view changes in document 
    } 

    // Imagine this is called by pressing a button in NewDocumentView 
    public void chooseDocumentAuthor() { 
     // What I want here is to navigate to the chooser screen, make my choice and 
     // then return to this screen having set the author on the document. 
     flow.goTo(new ChooseDocumentAuthorScreen()); 
    } 
    } 
} 

어떻게하면됩니까? 나는 PopupPopupPresenter으로 실험 해왔다. 그러나 이것들에 대한 많은 정보가 없기 때문에 이것은 선택자가 자신의 스크린이기 때문에 이것이 올바른 방법이라는 것을 확신하지 못한다.

업데이트 – 내가 좋아 작동하는 것 같다 다음했던 @rjrjr에서 아래의 답변을 바탕으로 잠재적 인 솔루션

:

TakesResult.java

public interface TakesResult<T> { 
    // Called when receiving a result 
    void onResult(T result); 
} 

NewDocumentScreen.java을

@Layout(R.layout.new_document_view) 
class NewDocumentScreen implements Blueprint, TakesResult<Author> { 

    private Document newDocument = new Document();  

    @Override public void onResult(Author result) { 
    newDocument.setAuthor(result); 
    } 

    // Imagine some Blueprint boiler plate here 

    @dagger.Module(injects = NewDocumentView.class, addsTo = MainScreen.Module.class) 
    class Module { 
    @Provides Document provideDocument() { return newDocument; } 
    @Provides NewDocumentScreen provideScreen() { return this; } 
    } 

    static class Presenter implements ViewPresenter<NewDocumentView> { 
    private final Flow flow; 
    private final NewDocumentScreen screen 
    private final Document newDocument; 

    @Inject Presenter(Flow flow, NewDocumentScreen screen, Document newDocument) { 
     this.flow = flow; 
     this.screen = screen; 
     this.newDocument = newDocument; 
    } 

    @Override 
    protected void onLoad(Bundle savedInstanceState) { 
     // Stuff to update view 
    } 

    // Imagine this is called by the view 
    public void chooseDocumentAuthor() { 
     // Since screen TakesResult we send it to the ChooseAuthorScreen 
     flow.goTo(new ChooseDocumentAuthorScreen(screen)); 
    } 
    } 
} 

ChooseAuthorScreen.java

@Layout(R.layout.choose_author_view) 
class ChooseAuthorScreen implements Blueprint { 
    private final TakesResult<Author> resultReceiver; 

    ChooseAuthorScreen(TakesResult<Author> resultReceiver) { 
    this.resultReceiver = resultReceiver; 
    } 

    // Imagine some Blueprint boiler plate here 

    @dagger.Module(injects = ChooseAuthorView.class, addsTo = MainScreen.Module.class) 
    class Module { 
    @Provides TakesResult<Author> provideResultReceiver() { return resultReceiver; } 
    } 

    static class Presenter implements ViewPresenter<ChooseAuthorView> { 
    private final Flow flow; 
    private final TakesResult<Author> resultReceiver; 

    @Inject Presenter(Flow flow, TakesResult<Author> resultReceiver) { 
     this.flow = flow; 
     this.resultReceiver = resultReceiver; 
    } 

    // Imagine this is called by the view 
    public void chooseAuthor(Author author) { 
     resultReceiver.onResult(author); 
     flow.goBack(); 
    } 
    } 
} 
+0

Parcelable에서 백 스택을 살해하고 다시 만들 수 있습니다. 이 경우'resultReceiver'는 아마도'null'이 될 것입니다. 그래서 나는 그것을한다. '((TakesResult ) (flow.getBackstack(). reverseIterator(). next(). getScreen()).) onResult (t);' 또한 결과가 있어야 할 때가있다. 사용자가 뒤로 버튼을 누르면'onExitScope()'에서 수행합니다. –

답변

0

팝업 및 PopupPresenter 아마 실수였다. 필자가 보아온 더 나은 기술은 "대화 상자"화면에 Flow backstack의 이전 화면 객체에있는 잘 알려진 과도 필드에 결과를 쓰게하는 것입니다. 한편으로 이것은 꽤 해커처럼 보인다. 반면에 매우 간단하고 읽기 쉽습니다.

+0

흥미 롭습니다. 고마워요. 나는 당신이 GitHub에 대한 이슈에서 그 효과에 대해 말한 것을 보았다. 나는 그것을 줄 것이고, 내가 어떻게하면되는지 알게 할 것이다. – kuhnza

+0

위의 질문에 대한 잠재적 인 해결책을 추가하기 만하면, 나는 당신이 제안한 것을 취했지만 두 인터페이스 간의 관계를 형식화하기위한 인터페이스를 추가했습니다. 생각? – kuhnza