如何使用 Factory 将自定义参数传递给 ViewModel? [英] How to pass custom parameters to a ViewModel using Factory?
问题描述
我知道为了将自定义参数传递给 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屋!