Android ViewModelの追加引数 質問する

Android ViewModelの追加引数 質問する

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()

おすすめ記事