web-dev-qa-db-ja.com

クラスViewModelのインスタンスを作成できません

Androidアーキテクチャコンポーネントを使用してサンプルアプリを作成しようとしていますが、何日も試しても動作しませんでした。上記の例外が発生します。

ライフサイクル所有者:-

public class MainActivity extends LifecycleActivity {

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.tv_user);
        PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);
        viewModel.loadPosts();
        viewModel.getPost().observe(this, new Observer<Post>() {
            @Override
            public void onChanged(@Nullable Post post) {
                if(post != null) {
                    textView.setText(post.toString());
                }
            }
        });
    }
}

ViewModel:-

public class PostViewModel extends ViewModel {
    private MediatorLiveData<Post> post;
    private PostRepository postRepo;

    PostViewModel() {
        post = new MediatorLiveData<>();
        postRepo = new PostRepository();
    }

    public LiveData<Post> loadPosts() {
        post.addSource(postRepo.getPost(),
                post -> this.post.setValue(post)
        );
        return post;
    }

    @NonNull
    public LiveData<Post> getPost() {
        return post;
    }
}
34
Parag Kadam

コンストラクターをpublicにします。

64
CommonsWare

ViewModelには、パラメーターが1つだけのコンストラクター(Application)があることを確認してください。

例:

public YourViewModel(Application application) {
    super(application);
    ...
11
vivek

Kotlinを使用している場合は、build.gradleannotationProcessorkaptに置き換えてください。

好む:

annotationProcessor "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"

となります

kapt "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"

そして追加

apply plugin: 'kotlin-kapt'ファイルの上にあるbuidl.gradle

Kotlinによる注釈処理

8
Max

私には完全に明らかではありませんでしたが、このエラーが発生した場合、パブリックコンストラクターを作成して解決しました。私のコンストラクタは、Android開発者の例から派生し、パラメータとしてリポジトリを含んでいます。パラメーターなしで空である追加のコンストラクターを作成し、パブリックにすることで問題を解決しました。

つまり、あなたの場合

public PostViewModel() {}

4
Brandon

クラスとコンストラクタを公開して、問題を解決しました。

3
RaghavPai
  1. ほとんどの場合、ソリューションは他の答えとしてクラスとコンストラクタを公開しています
  2. また、ランタイムエラーの可能性もあります。複数の原因がリストされている場合は、Logcatエラーログを確認してください。
2
lomec

例外をスローする理由はほとんどありません。それらのいくつかに言及しました。

  1. ビューModelクラスがパブリックであることを確認してください
  2. ビューモデルクラスコンストラクターがパブリックであることを確認してください

  3. ルームや追加した他のライブラリを使用する場合も、ライフサイクルのgridleファイルに依存関係を追加したことを確認してください。

  4. オブジェクトを作成する場合、ビューモデルクラスコンストラクター内の他の依存クラス。他のクラスはエラーをスローして、viewModelのインスタンスを作成できます
2

AndroidXに移行した後にこれを取得しました。

Proguardがコンストラクターを削除するandroidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01にバグがあります。

https://issuetracker.google.com/issues/112230489

2.0.0にアップグレードして修正し、必要に応じてプロガードルールを更新することを忘れないでください。

エラーメッセージは次のようになりました。

Java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.Java:202)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.Java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.Java:103)
......
Caused by: Java.lang.NoSuchMethodException: <init> [class Android.app.Application]
at Java.lang.Class.getConstructor0(Class.Java:2204)
at Java.lang.Class.getConstructor(Class.Java:1683)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.Java:200)
... 34 more


  androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 539, 1167 and precision: 16, 16' on view 'with id: my.test:id/button_return_to_main_menu'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.Java:82)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.Java:79)
.....
Caused by: Java.lang.RuntimeException: Unable to start activity ComponentInfo{my.custom.domain.MainActivity}: Java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2646)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2707)
1
Lydia Ralph

アクティビティ内でビューモデルを使用した場合、アクティビティが「DaggerAppCompatActivity」を拡張しているかどうかを確認してください

例えば

public class UserComments extends AppCompatActivity 

これを

public class UserComments extends DaggerAppCompatActivity
1

ViewModelクラスからAndroidViewModelを拡張します。

public class YourViewModel extends AndroidViewModel {

    public YourViewModel(Application application) {
        super(application);

        //Todo: ...
    }

}
1
Zeero0

パラメーターなしで空である追加のコンストラクターを作成し、パブリックにすることで問題を解決しました。

0
Sumit Shukla

postViewModelクラスが内部クラスである場合、パブリックおよび静的であることを確認してください

0
Lasitha Lakmal

私はこの例を使用しています Android-arcuitecture-component BasicSample 新しいプロジェクトを作成し、同様のエラーログに直面して、アプリケーション名を変更していないことがわかりました

AndroidManifest.xml

それが私のエラーでした。アプリ名をde BasicAppに修正するために、このクラスはこの例で実装されています。

...
<application
    Android:name=".BasicApp"
    Android:allowBackup="false"
0
Sebastian Duran

私の場合、ListItemViewModelFactoryを使用して、ビューモデルにパラメーターを渡す必要がありました。

0
Loren