如何使用 Factory 将自定义参数传递给 ViewModel? [英] How to pass custom parameters to a ViewModel using Factory?

查看:57
本文介绍了如何使用 Factory 将自定义参数传递给 ViewModel?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道为了将自定义参数传递给 ViewModel,我们可以使用 ViewModelProvider.NewInstanceFactory,像这样:

I am aware in order to pass custom parameters to ViewModel, we can use ViewModelProvider.NewInstanceFactory, Like this:

// Factory Class    
class MyFactory extends ViewModelProvider.NewInstanceFactory {

        private final String mId;
        public MyFactory(String id) {
            mId = id;
        }

        @NonNull
        @Override
        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
            return (T) new MyViewModel(mId);
        }
    }


// MyViewModel class
class MyViewModel extends ViewModel {

  public MyViewModel(String id) {
     ...
  }
}

// Activity I can Initialise as: 
MyFactory modelFactory = new MyFactory(id);
viewModel = ViewModelProviders.of(this, modelFactory).get(MyViewModel.class);

如何使用 AndroidViewModel 子类中的自定义参数以及应用程序上下文来实现相同的效果.喜欢

How can I achieve the same with custom parameters in the AndroidViewModel subclass along with the Application context. Like

// MyAndroidViewModel class
    class MyAndroidViewModel extends AndroidViewModel {

      public MyViewModel(Application context, String id) {
         super(context);
         ...
      }
    }

如何初始化 MyAndroidViewModel 以及 ViewModelProvider.NewInstanceFactory 在这里如何发挥作用?

How to initialise MyAndroidViewModel and how ViewModelProvider.NewInstanceFactory comes into play here?

推荐答案

我以前遇到过这个问题,我通过这样做来解决它.在您的活动中,创建您的 ViewModel 工厂,如下所示:

I had this problem previously and I managed it by doing this. In your activity create your ViewModel factory as below :

//Inside MyActivity
ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {
            @NonNull
            @Override
            public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
                return (T) new MyAndroidViewModel(getApplication(),
                        "My string!");
            }
        };

然后用它来创建你的 ViewModel :

And then use it to create your ViewModel :

viewModel = ViewModelProviders.of(this, factory).get(MyAndroidViewModel.class); 

更新:

由于 ViewModelProviders 类已被弃用,更新后的答案如下.工厂和以前一样,只是换成了 Kotlin.

As the ViewModelProviders class has been deprecated, the updated answer would be as below. The factory is the same as before, it has just changed to Kotlin.

var factory = object : ViewModelProvider.Factory {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return  SimpleAndroidViewModel(activity!!.application,
                "My string!") as T
        }
    }

但是,我们创建 ViewModel 实例的行已经改变,现在我们使用了 ViewModelProvider 类.

However, the line where we were creating the ViewModel instance has changed and now we are using the ViewModelProvider class.

private val viewModel: SimpleAndroidViewModel by lazy {
        ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)
    }

这篇关于如何使用 Factory 将自定义参数传递给 ViewModel?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆