无法在android中创建AndroidViewModel类的实例。

问题描述 投票:0回答:1

我正试图用Android ViewModel添加Room数据库。我按照这个链接进行了同样的操作 https:/codelabs.developer.google.comcodelabsandroid-room-with-a-view#13。

我收到一个异常。

Caused by: 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); }

}

我也试过使用视图模型工厂调用视图模型,但没有成功,这里是

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);

下面是我的gradle

  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"

请你帮忙 谢谢你的帮助。

java android instantiation android-viewmodel android-mvvm
1个回答
2
投票

你正在传递一个 Application 作为参数,向 FavouritesViewModel 构造函数。所以让你的类扩展 AndroidViewModel

public class FavouritesViewModel extends AndroidViewModel

然后,在您的片段(或活动)中

FavouritesViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(a.getApplication()).create(FavouritesViewModel.class);

1
投票

您的ViewModel需要一个 ViewModel factory 类实例化.我的代码在Kotlin和我也面临着同样的问题,下面的链接提供了答案,但在kotlin。https:/codelabs.developer.google.comcodelabskotlin-android-training-view-model#7。

更多信息请看这里。

https:/github.comandroidarchitecture-components-samplesblobmasterBasicRxJavaSampleappsrcmainjavacomexampleandroidobservabilityuiViewModelFactory.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
投票

你应该像这样创建ViewModel的实例。

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

或者你也可以使用

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

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.