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());
}
}
}
어떻게하면됩니까? 나는 Popup과 PopupPresenter으로 실험 해왔다. 그러나 이것들에 대한 많은 정보가 없기 때문에 이것은 선택자가 자신의 스크린이기 때문에 이것이 올바른 방법이라는 것을 확신하지 못한다.
업데이트 – 내가 좋아 작동하는 것 같다 다음했던 @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();
}
}
}
Parcelable에서 백 스택을 살해하고 다시 만들 수 있습니다. 이 경우'resultReceiver'는 아마도'null'이 될 것입니다. 그래서 나는 그것을한다. '((TakesResult) (flow.getBackstack(). reverseIterator(). next(). getScreen()).) onResult (t);' 또한 결과가 있어야 할 때가있다. 사용자가 뒤로 버튼을 누르면'onExitScope()'에서 수행합니다. –