AndroidViewModel
アプリケーション コンテキスト以外の追加の引数をカスタム コンストラクターに渡す方法はありますか。例:
public class MyViewModel extends AndroidViewModel {
private final LiveData<List<MyObject>> myObjectList;
private AppDatabase appDatabase;
public MyViewModel(Application application, String param) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param);
}
}
そして、カスタムViewModel
クラスを使用する場合は、フラグメントで次のコードを使用します。
MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
String param
そのため、カスタムに追加の引数を渡す方法がわかりませんViewModel
。アプリケーション コンテキストのみを渡すことができますが、追加の引数は渡せません。ご協力いただければ幸いです。ありがとうございます。
編集: コードをいくつか追加しました。これで良くなったと思います。
ベストアンサー1
ViewModel 用のファクトリ クラスが必要です。
public class MyViewModelFactory implements ViewModelProvider.Factory {
private Application mApplication;
private String mParam;
public MyViewModelFactory(Application application, String param) {
mApplication = application;
mParam = param;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return (T) new MyViewModel(mApplication, mParam);
}
}
ビュー モデルをインスタンス化するときは、次のようにします。
MyViewModel myViewModel = new ViewModelProvider(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);
Kotlin の場合、委任されたプロパティを使用できます。
val viewModel: MyViewModel by viewModels { MyViewModelFactory(getApplication(), "my awesome param") }
また、別の新しいオプションもあります。ファクトリのインスタンス化を実装してHasDefaultViewModelProviderFactory
オーバーライドし、ファクトリなしでを呼び出すというものです。getDefaultViewModelProviderFactory()
ViewModelProvider(this)
by viewModels()