1. ホーム
  2. android

[解決済み] Android ViewModelの追加引数

2022-04-28 05:30:58

質問

カスタムメソッドに追加の引数を渡す方法はありますか? 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 . アプリケーションコンテキストだけを渡すことができ、追加の引数は渡せません。私は本当にどんな助けでも感謝します。ありがとうございました。

Edit: コードを追加しました。これでよくなると思います。

どのように解決するのですか?

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 = ViewModelProvider(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);

kotlinの場合、delegatedプロパティを使用することができます。

val viewModel: MyViewModel by viewModels { MyViewModelFactory(getApplication(), "my awesome param") }

また、もうひとつの新しいオプションとして HasDefaultViewModelProviderFactory をオーバーライドして getDefaultViewModelProviderFactory() をファクトリーのインスタンス化とともに呼び出し、その後に ViewModelProvider(this) または by viewModels() ファクトリーなし