【问题标题】:Where should we update the model in MVVM我们应该在哪里更新 MVVM 中的模型
【发布时间】:2019-05-14 15:12:24
【问题描述】:

我正在学习 MVVM。我正在阅读关于 MVVM 的示例代码https://codelabs.developers.google.com/codelabs/android-room-with-a-view。有一个 Book 实体,它已从如下活动更新:

Book book = new Book();
book.setName(x);

但我认为我们不应该在 View 层中有模型实例,我们应该在 ViewModel 中执行此操作,而不是在 View 中。视图中类似于以下代码:

MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
viewModel.setBookName(x);

我的问题是我们可以在 View 中实例化一个实体吗?这样做的正确方法是什么?

【问题讨论】:

  • 你说得对,View 不应该直接与Models 协调,这就是ViewModel 出现在图片中的原因。 (尽管您编写的语法不是启动 ViewModel 的建议方式)
  • 通过实例化实体,你的实际需求是什么?
  • 你应该只更新视图模型中的模型类。

标签: android mvvm


【解决方案1】:

您应该只在 View Model 中更新模型类..

为活动创建接口IContract.java

 public interface IContract {

    interface View 
    {
        public void displayModelData();

    }

    interface ViewModel 
    {
        public Book setModelData();
        public Book getModelData();
    }
}
  • 然后在Activity类中实现View接口,在ViewModel类中实现View Model接口..
  • 现在在 Activity 类中创建一个引用 ViewModel 对象。

  • 我们可以使用该对象将数据从 ViewModel 传递到 View

活动类MainActivity.java

public class MainActivity implements IContract.View {
    private IContract.ViewModel viewModel; //create a instance for ViewModel object

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

        this.viewModel = new MainActivityViewModel(getApplicationContext());// object initialisation


        @overide
        public void displayModelData()
        {
            viewModel.setModelData(); // update model class
            Book obj = viewModel.getModelData();// this will get book object from viewModel class.
            Toast(obj.Name);
        }

    }
}

MainActivityViewModel.java

  public class MainActivityViewModelimplements IContract.ViewModel

{
    Context context;
    Book book;

    public void MainActivityViewModel (Context context)
    {
        this.context = context;
    }


    @Override
    public void setModelData ()
    {
        book = new Book(); // update model class.
        book.setName(x);
    }

    @Override
    public Book getModelData ()
    {
        return book; //return the object to the view
    }

}

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2023-03-27
    • 1970-01-01
    • 2011-06-10
    • 2018-08-06
    • 2017-01-06
    相关资源
    最近更新 更多