web-dev-qa-db-ja.com

AndroidViewModelにはゼロ引数コンストラクターがありません

MainViewでAndroidViewModelのインスタンスを作成しようとしています。これを行うと、次のエラーが発生しますゼロ引数コンストラクターがありません

これが私のRecipeViewModelです

package com.example.kookrecepten;

import Android.app.Application;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import Java.util.List;

public class RecipeViewModel extends AndroidViewModel {
    private RecipeRepository recipeRepository;
    private LiveData<List<Recipe>> allRecipes;

    public RecipeViewModel(Application application) {
        super(application);
        recipeRepository = new RecipeRepository(application);
        allRecipes = recipeRepository.getAllRecipes();
    }

    public void insert(Recipe recipe) {
        recipeRepository.insert(recipe);
    }

    public void update(Recipe recipe) {
        recipeRepository.update(recipe);
    }

    public void delete(Recipe recipe) {
        recipeRepository.delete(recipe);
    }

    public void deleteAll() {
        recipeRepository.deleteAllRecipes();
    }

    public LiveData<List<Recipe>> getAllRecipes() {
        return allRecipes;
    }
}

間違っている場合は修正してください。ただし、AndroidViewModelにはコンストラクターのApplicationコンテキストが必要で、ViewModelには必要ありません。したがって、Android=がゼロ引数コンストラクタを要求する理由がわかりません。

これがインスタンスを要求する私のメインアクティビティです。

package com.example.kookrecepten;

import Android.os.Bundle;
import Android.view.View;
import Android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.example.kookrecepten.databinding.ActivityMainBinding;

import Java.util.List;


public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;
    private RecipeViewModel recipeViewModel;

    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        //Get an instance of the RecipeViewModel.
        recipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);
        recipeViewModel.getAllRecipes().observe(this, new Observer<List<Recipe>>() {
            @Override
            public void onChanged(List<Recipe> recipes) {
                //Update recycle view

                Toast.makeText(MainActivity.this, "triggered", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

そして、これは私の実装です。

def lifecycle_version = "2.2.0"
def room_version = "2.2.5"

//LifeCycle Components
    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
    // Annotation processor
    implementation "androidx.lifecycle:lifecycle-common-Java8:$lifecycle_version"

    //Room Components
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
3
Ruben

Androidソースコードを確認しました。アクティビティがActivityではなくAppCompatActivityクラスを拡張している場合、この問題は発生しませんでした。クラスActivityは、インターフェイスHasDefaultViewModelProviderFactoryの実装を提供します。は、AndroidViewModelを拡張するクラスに正しいファクトリを提供します。残念ながら、AppCompatActivityはまだそのインターフェースを実装していないため、正しいファクトリは利用できません。そのため、ファクトリを提供するか、インターフェースHasDefaultViewModelProviderFactoryを自分で実装することができます。

0
Omar BELKHODJA

hiltを使用している場合、@ AndroidEntryPointでアクティビティに注釈を付けるのを忘れた可能性があります

0

古い非推奨の機能を試していただけますか

recipeViewModel = ViewModelProviders.of(this).get(RecipeViewModel.class);

これは間違いなく私たちのアプリケーションで機能していました。冒険的なタイプの場合は、デバッガーを使用してViewModelProviderのget()メソッドにステップインし、viewmodelのインスタンスを取得する方法を確認することもできます。

0
Ridcully