1. ホーム
  2. android

[解決済み] Android ViewModel にはゼロ引数のコンストラクタがない

2023-08-09 10:21:09

質問

私は この のドキュメントを参照して、LiveDataとViewModelについて勉強しています。 ドキュメントでは、ViewModelクラスは、このようなコンストラクタを持っています。

public class UserModel extends ViewModel {
  private MutableLiveData<User> user;

  @Inject UserModel(MutableLiveData<User> user) {
    this.user = user;
  }

  public void init() {
    if (this.user != null) {
      return;
    }
    this.user = new MutableLiveData<>();
  }

  public MutableLiveData<User> getUser() {
    return user;
  }
}

しかし、このコードを実行すると、例外が発生します。

final UserViewModelviewModel = ViewModelProviders.of(this).get(UserViewModel.class);

原因:java.lang.RuntimeException: クラスUserViewModelのインスタンスを作成できません。 原因:java.lang.InstantiationException: java.lang.Class はゼロ引数のコンストラクタを持ちません。

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

のサブクラスを初期化する際に ViewModel を使って ViewModelProviders を使用すると、デフォルトでは UserModel クラスがゼロ引数のコンストラクタを持っていることを期待します。 この場合、コンストラクタには引数 MutableLiveData<User> user .

これを解決する一つの方法は、デフォルトの引数なしのコンストラクタを UserModel .

そうでない場合、ViewModel クラスに 0 以外の引数のコンストラクタを持たせたい場合は、カスタムの ViewModelFactory クラスを作成し、ViewModel のインスタンスを初期化する必要があります。 ViewModelProvider.Factory インターフェイスを実装しています。

私はまだ試していませんが、これに関する優れたGoogleのサンプルへのリンクはこちらです。 github.com/googlesamples/android-architecture-components . 具体的には、このクラスをチェックしてください。 GithubViewModelFactory.java を、そしてこのクラス GithubViewModelFactory.kt を、対応するKotlinのコードに使用します。