Mortar/Flow と Dagger 2 を使用してアプリをセットアップしました。同じクラスの 2 つのビューを切り替える場合を除いて、機能しているようです。新しいビューは、前のビューのプレゼンターで終了します。
たとえば、conversationId をコンストラクター引数として受け取る ConversationScreen があります。初めて ConversationScreen を作成して Flow に追加すると、ConversationView が作成され、画面に渡された conversationId で作成された Presenter が挿入されます。次に、別の conversationId で新しい ConversationScreen を作成すると、ConversationView がプレゼンターを要求すると、以前の ConversationScreen でスコープがまだ閉じられていないため、Dagger は古いプレゼンターを返します。
新しい画面をセットアップする前に、前の画面のスコープを手動で閉じる方法はありますか? それとも、最初から間違ったスコープを設定しただけですか?
会話ビュー
public class ConversationView extends RelativeLayout {
@Inject
ConversationScreen.Presenter presenter;
public ConversationView(Context context, AttributeSet attrs) {
super(context, attrs);
DaggerService.<ConversationScreen.Component>getDaggerComponent(context).inject(this);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
presenter.takeView(this);
}
@Override
protected void onDetachedFromWindow() {
presenter.dropView(this);
super.onDetachedFromWindow();
}
}
会話画面
@Layout(R.layout.screen_conversation)
public class ConversationScreen extends Paths.ConversationPath implements ScreenComponentFactory<SomeComponent> {
public ConversationScreen(String conversationId) {
super(conversationId);
}
@Override
public String getTitle() {
title = Conversation.get(conversationId).getTitle();
}
@Override
public Object createComponent(SomeComponent parent) {
return DaggerConversationScreen_Component.builder()
.someComponent(parent)
.conversationModule(new ConversationModule())
.build();
}
@dagger.Component(
dependencies = SomeComponent.class,
modules = ConversationModule.class
)
@DaggerScope(Component.class)
public interface Component {
void inject(ConversationView conversationView);
}
@DaggerScope(Component.class)
@dagger.Module
public class ConversationModule {
@Provides
@DaggerScope(Component.class)
Presenter providePresenter() {
return new Presenter(conversationId);
}
}
@DaggerScope(Component.class)
static public class Presenter extends BasePresenter<ConversationView> {
private String conversationId;
@Inject
Presenter(String conversationId) {
this.conversationId = conversationId;
}
@Override
protected void onLoad(Bundle savedInstanceState) {
super.onLoad(savedInstanceState);
bindData();
}
void bindData() {
// Show the messages in the conversation
}
}
}