我有一个使用 Mortar/Flow 和 Dagger 2 设置的应用程序。它似乎可以工作,除非我在同一类的两个视图之间切换。新视图以前一个视图的演示者结束。
例如,我有一个 ConversationScreen,它将一个 conversationId 作为构造函数参数。我第一次创建 ConversationScreen 并将其添加到 Flow 时,它会创建 ConversationView,它会向自己注入一个 Presenter,该 Presenter 是使用传递给屏幕的 conversationId 创建的。如果我随后创建一个具有不同会话 ID 的新 ConversationScreen,当 ConversationView 请求 Presenter 时,Dagger 将返回旧的 Presenter,因为范围尚未在前一个 ConversationScreen 上关闭。
有没有办法让我在设置新屏幕之前手动关闭前一个屏幕的范围?还是我刚开始就设置了范围错误?
对话视图
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
}
}
}