使用MVP在演示者中恢复状态

时间:2018-07-01 03:20:29

标签: android mvp

https://medium.com/@cervonefrancesco/model-view-presenter-android-guidelines-94970b430ddf说恢复模型中的状态,而不是演示者。如果我有一个非常简单的“模型”,比如说将文本视图更新为打开或关闭的二进制切换,该怎么办?创建一个具有单个字符串值的模型Toggle类似乎有些过分。

另一个选择是将捆绑包从我的活动传递到onSaveInstanceState内的演示者中的相应方法中,并类似于onCreate进行还原。 但是文章还说我们应该避免在演示者中有android依赖项

最后,我尝试使用Icepick,但这不起作用:

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
    (Button) findViewById(R.id.btn).setOnClickListener(this);
    presenter.onCreate();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
}

@Override
public void onClick(View view) {
    presenter.onButtonClicked();
}

@Override
public void updateState(String state) {
    tv.setText(state);
}

MainPresenter.java

    public class MainPresenter {

    private MainView mainView;
    @State String toggle;

    @Inject
    public MainPresenter(MainView mainView) {
        this.mainView = mainView;
    }

    void onCreate() {
        mainView.updateState(toggle);
    }

    void onButtonClicked() {
        mainView.updateState(toggle.equals("on") ? "off" : "on");
    }
}

我有什么选择?如果必须使用模型方法,我可以为我的案例看到一个例子吗?

1 个答案:

答案 0 :(得分:0)

如果您使用注释处理来维持状态,则没有Icepick.saveInstanceState(this, outState)(您无法在演示者中调用)的情况下,它将不会自动将数据填充到演示者中。

@State String toggle;

此行应出现在活动中。演示者中有一种方法可以通过切换请求数据。像这样:

@State String toggle = "off"; //default value

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState);
(Button) findViewById(R.id.btn).setOnClickListener(this);
presenter.onCreate();
presenter.setState(toggle)
}

您可以将此值存储为演示者中的全局变量,并据此确定应用程序流程。