我正试图用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"
请你帮忙 谢谢你的帮助。
你正在传递一个 Application
作为参数,向 FavouritesViewModel
构造函数。所以让你的类扩展 AndroidViewModel
public class FavouritesViewModel extends AndroidViewModel
然后,在您的片段(或活动)中
FavouritesViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(a.getApplication()).create(FavouritesViewModel.class);
您的ViewModel需要一个 ViewModel factory
类实例化.我的代码在Kotlin和我也面临着同样的问题,下面的链接提供了答案,但在kotlin。https:/codelabs.developer.google.comcodelabskotlin-android-training-view-model#7。
更多信息请看这里。
编辑这是我的一个项目的视图模型工厂类。
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中的
你应该像这样创建ViewModel的实例。
favouritesViewModel = new ViewModelProvider(this,
new FavouritesViewModelFactory()).get(FavouritesViewModel.class);
或者你也可以使用
favouritesViewModel = ViewModelProviders.of(this,
new FavouritesViewModelFactory()).get(FavouritesViewModel.class)
希望对你有所帮助。