【问题标题】:Initialize Model in View or in Presenter - MVP Pattern在 View 或 Presenter 中初始化模型 - MVP 模式
【发布时间】:2019-11-26 09:02:14
【问题描述】:

当您在 Android 中使用 MVP 架构时,是否可以在视图中初始化模型?下面是 View 类的例子:

public class ViewActivity extends BaseActivity {

@BindView(R.id.lastNameEdt)
EditText lastNameEdt;
@BindView(R.id.firstNameEdt)
EditText firstNameEdt;
@BindView(R.id.middleNameEdit)
EditText middleNameEdit;

User userModel; <-----

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);

    userModel = new User();  
    userModel.firstName = lastNameEdt.getText.toString();

}

}

我想知道实现 MVP 架构模式时的最佳方法/最佳实践是什么,尤其是对于 Android。

我在视图中初始化模型的原因是因为我想通过意图将它传递给另一个活动。 你认为什么是最好的?如果我将模型放在 View 上还是应该放在 Presenter 上,是否仍然可以接受?

【问题讨论】:

    标签: android android-intent mvp


    【解决方案1】:

    您可以做的一件事是使用对象向演示者注入依赖项。

    例子

    查看

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
    
        presenter = new Presenter(this,new User());
    
    }
    

    然后在您的 Presenter 中,您可以从视图中获取该实例,在您需要在 Presenter 中使用它执行的每个逻辑中使用它,然后使用您的 Presenter 的方法从该模型中获取您需要的信息。

    演示者

    Presenter(View view,User user) {
            this.view = view
            this.user = user
        }
    
    private String exampleMethod(){
    return user.firstName + " " + " StackOverflow "
    }
    

    在这里您会看到,每次在视图中实例化 Presenter 时,您的 Presenter 中都会有 1 个模型实例,因此每次您想要将数据获取到视图时,只需调用 Presenter 以获取数据显示。

    查看

    onCreate(){
    ...
    presenter = new Presenter(this,new User());
    presenter.exampleMethod();
    }
    

    【讨论】:

      【解决方案2】:

      mvp 做的主要事情是,它将数据层和视图层分开,如果您在视图类中使用模型,则意味着您的视图直接与数据通信。

      最好的方法是在presenter层使用模型。 如果您想将数据传递给模型,只需在 Presenter 构造函数中再添加一个参数即可。

          Presenter(View view,String data) {
              this.view = view
              this.data = data
          }
      

      【讨论】:

      • 但是如何在不将模型初始化为 View 的情况下将模型传递给 Presenter?最后还是需要先在View上初始化一下。我对吗?谢谢
      • 不需要在view中初始化,会在Presenter类中初始化
      • 有一个简单的规则,当数据发生变化时,模型会通知演示者,并且演示者会要求视图更新
      【解决方案3】:

      在此示例中,如果您只是尝试通过从视图的布局 (ViewActivity) 获取对象的值来传递对象,则在实现 MVP 时没有最佳方法/最佳实践。我建议:

      intent.putExtra(String, Serializable/Parcelable)
      

      并在那里设置对象的参数。

      希望能回答你的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多