如何使用 Factory 将自定义参数传递给 ViewModel?
How to pass custom parameters to a ViewModel using Factory?
我知道为了将自定义参数传递给 ViewModel,我们可以使用 ViewModelProvider.NewInstanceFactory,像这样:
// 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 子类中的自定义参数以及应用程序上下文来实现相同的目的。喜欢
// MyAndroidViewModel class
class MyAndroidViewModel extends AndroidViewModel {
public MyViewModel(Application context, String id) {
super(context);
...
}
}
如何初始化 MyAndroidViewModel 以及 ViewModelProvider.NewInstanceFactory 如何在这里发挥作用?
我以前遇到过这个问题,我通过这样做解决了它。在您的 activity 中创建您的 ViewModel
工厂,如下所示:
//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
:
viewModel = ViewModelProviders.of(this, factory).get(MyAndroidViewModel.class);
更新:
由于 ViewModelProviders
class 已被弃用,更新后的答案如下所示。 factory和之前一样,只是改成了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
class.
private val viewModel: SimpleAndroidViewModel by lazy {
ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)
}
我知道为了将自定义参数传递给 ViewModel,我们可以使用 ViewModelProvider.NewInstanceFactory,像这样:
// 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 子类中的自定义参数以及应用程序上下文来实现相同的目的。喜欢
// MyAndroidViewModel class
class MyAndroidViewModel extends AndroidViewModel {
public MyViewModel(Application context, String id) {
super(context);
...
}
}
如何初始化 MyAndroidViewModel 以及 ViewModelProvider.NewInstanceFactory 如何在这里发挥作用?
我以前遇到过这个问题,我通过这样做解决了它。在您的 activity 中创建您的 ViewModel
工厂,如下所示:
//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
:
viewModel = ViewModelProviders.of(this, factory).get(MyAndroidViewModel.class);
更新:
由于 ViewModelProviders
class 已被弃用,更新后的答案如下所示。 factory和之前一样,只是改成了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
class.
private val viewModel: SimpleAndroidViewModel by lazy {
ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)
}