Невозможно создать экземпляр класса AndroidViewModel в android - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь добавить базу данных комнат с Android ViewModel. Я перешел по этой ссылке для того же https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#13

Я получаю исключение:

Причина: java .lang.RuntimeException: Невозможно создать экземпляр класса com.example.dailyfaithapp.ViewModels.FavouritesViewModel

Я проверил несколько вопросов и ответов по SO, но ни один из них не работает для меня.

Вот моя модель представления

public class FavouritesViewModel extends ViewModel {

        public FavouriteRepository mRepository;

        public LiveData<List<Favourites>> mAllFavourites;

    public FavouritesViewModel (Application application) {
            mRepository = new FavouriteRepository(application);
            mAllFavourites = mRepository.getmAllFavourites();
        }

        public LiveData<List<Favourites>> getmAllFavourites() { return mAllFavourites; }

        public void insert(Favourites favourites) { mRepository.insertFavourite(favourites); }

}

Я также пытался вызвать модель View с использованием фабрики модели представления, но здесь это не сработало.

public class FavouritesViewModelFactory implements ViewModelProvider.Factory {
    private Application mApplication;
    private String mParam;


    public FavouritesViewModelFactory(Application application) {
        mApplication = application;
    }


    @Override
    public <T extends ViewModel> T create(Class<T> modelClass) {
        return (T) new FavouritesViewModel(mApplication);
    }
}

Я создаю такой экземпляр после попытки многих опций, следующих за SO:

    favouritesViewModel = new ViewModelProvider(this,
            new ViewModelProvider.NewInstanceFactory()).get(FavouritesViewModel.class);

Вот мой грейдл

  implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
    implementation 'com.jaeger.statusbarutil:library:1.4.0'
    implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'
    implementation "com.github.skydoves:balloon:1.1.5"
    implementation 'com.afollestad.material-dialogs:core:3.3.0'
    annotationProcessor 'org.projectlombok:lombok:1.18.12'

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

Пожалуйста, помогите. Спасибо.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Вы передаете Application в качестве параметра конструктору FavouritesViewModel. Поэтому сделайте ваш класс расширенным AndroidViewModel

public class FavouritesViewModel extends AndroidViewModel

Затем в вашем фрагменте (или деятельности)

FavouritesViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(a.getApplication()).create(FavouritesViewModel.class);
0 голосов
/ 27 апреля 2020

Вашему ViewModel нужен класс ViewModel factory для создания экземпляра. Я кодирую в Kotlin, и я также столкнулся с той же проблемой, ссылка на которую приведена ниже, но в kotlin. https://codelabs.developers.google.com/codelabs/kotlin-android-training-view-model/#7

Для получения дополнительной информации отметьте это:

https://github.com/android/architecture-components-samples/blob/master/BasicRxJavaSample/app/src/main/java/com/example/android/observability/ui/ViewModelFactory.java

РЕДАКТИРОВАТЬ Это мой класс фабрики представлений одного из моих проектов

class AccountspageViewModelFactory
 (
    private val dataSource: accountDao,

    private val application: Application
) : ViewModelProvider.Factory {
    @Suppress("unchecked_cast")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(AccountspageViewModel::class.java)) {
            return AccountspageViewModel(dataSource,application) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

, и вот как я его создал во фрагменте

 val application = requireNotNull(this.activity).application
        val dataSource = accountsdatabase.getInstance(application)?.accountdao

        val viewModelFactory = dataSource?.let { AccountspageViewModelFactory(it,application) }
        val viewModel =
            ViewModelProviders.of(this, viewModelFactory).get(AccountspageViewModel::class.java)\

Измените его в соответствии с вашим проектом, но это в kotlin

0 голосов
/ 27 апреля 2020

Вы должны создать экземпляр ViewModel следующим образом

favouritesViewModel = new ViewModelProvider(this,
        new FavouritesViewModelFactory()).get(FavouritesViewModel.class);

Или также вы можете использовать

favouritesViewModel = ViewModelProviders.of(this,
        new FavouritesViewModelFactory()).get(FavouritesViewModel.class)

надеюсь, это поможет вам.

...