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"
Androidソースコードを確認しました。アクティビティがActivity
ではなくAppCompatActivity
クラスを拡張している場合、この問題は発生しませんでした。クラスActivity
は、インターフェイスHasDefaultViewModelProviderFactory
の実装を提供します。は、AndroidViewModelを拡張するクラスに正しいファクトリを提供します。残念ながら、AppCompatActivity
はまだそのインターフェースを実装していないため、正しいファクトリは利用できません。そのため、ファクトリを提供するか、インターフェースHasDefaultViewModelProviderFactory
を自分で実装することができます。
hiltを使用している場合、@ AndroidEntryPointでアクティビティに注釈を付けるのを忘れた可能性があります
古い非推奨の機能を試していただけますか
recipeViewModel = ViewModelProviders.of(this).get(RecipeViewModel.class);
これは間違いなく私たちのアプリケーションで機能していました。冒険的なタイプの場合は、デバッガーを使用してViewModelProviderのget()メソッドにステップインし、viewmodelのインスタンスを取得する方法を確認することもできます。