[英]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如何在這里發揮作用?
我以前遇到過這個問題,我通過這樣做來解決它。 在您的活動中,創建您的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
類已被棄用,更新后的答案如下。 工廠和以前一樣,只是換成了 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
類。
private val viewModel: SimpleAndroidViewModel by lazy {
ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.