是否有可能在一个带有 Mortar 库的 Activity 中有几个相同视图的实例?在这种情况下如何初始化 Activity 的范围?或者应该以某种方式为每个视图创建一个单独的范围?
我想要的是:
我的活动 - 我的视图 (id:1) - 我的视图 (id:2)
我试过了,但是我的 Presenter 的 onLoad/onSave 都搞砸了。
无需为孩子设置子范围。或者,真的,这总是一种优化。
Presenter 总是必须是一个单例,所以如果您需要有多个视图同时显示相同类型的 Presenter,您需要做一些事情来为每个视图创建一个单例。例如,您可以为 Presenter 提供一个基类,并为各个视图类型提供子类,或者可以使用绑定注释(例如 @Inject @TheBlueOne MyPresenter Presenter;)。
如果你正在做一些更动态的事情,比如制作一个所有需要相同类型演示者的子视图列表,你可以让父视图的演示者成为子演示者的工厂。一个想法:
ParentView {
void addRow(int id) {
MyRowView newRow = new MyRowView(getContext(), presenter);
newRow.setId(id);
addChild(newRow);
}
}
ChildView {
final ParentPresenter parentPresenter;
ChildPresenter presenter;
public ChildView(Context context, ParentPresenter parentPresenter) {
super(context);
this.parentPresenter = parentPresenter;
}
protected void onAttachedToWindow() {
super.onAttachedToWindow();
presenter = parentPresenter.getChild(getId());
presenter.takeView(this);
}
protected void onDetachedFromWindow() {
presenter.dropView(this);
super.onDetachedFromWindow();
}
}
@Singleton
ParentPresenter {
final Map<Integer, ChildPresenter> childrens = new HashMap<>();
final Provider<ChildPresenter> childrensProvider;
@Inject
ParentPresenter(Provider<ChildPresenter> childrensProvider) {
this.childrensProvider = childrensProvider;
}
ChildPresenter getChild(int id) {
ChildPresenter child = childrens.get(id);
if (childPresenter == null) {
child = childrensProvider.get();
childrens.put(id, child);
}
return child;
}
}