Android 如何使此ViewModelFactory更加灵活并接受不同类型的ViewModel类?
我复制了一个带有Android架构组件、改装、匕首和数据绑定的MVVM示例。我使用这段代码作为我的应用程序的起点,以便在Android应用程序开发中开始使用更好的架构。但是,以这些代码为例:Android 如何使此ViewModelFactory更加灵活并接受不同类型的ViewModel类?,android,android-viewmodel,android-mvvm,Android,Android Viewmodel,Android Mvvm,我复制了一个带有Android架构组件、改装、匕首和数据绑定的MVVM示例。我使用这段代码作为我的应用程序的起点,以便在Android应用程序开发中开始使用更好的架构。但是,以这些代码为例: interface ViewModelInjector { /** * Injects required dependencies into the specified PostListViewModel. * @param postListViewModel PostListV
interface ViewModelInjector {
/**
* Injects required dependencies into the specified PostListViewModel.
* @param postListViewModel PostListViewModel in which to inject the dependencies
*/
fun inject(postListViewModel: PostListViewModel)
@Component.Builder
interface Builder {
fun build(): ViewModelInjector
fun networkModule(networkModule: NetworkModule): Builder
}
}
及
主要问题是它被
PostListViewModel
卡住了。我想以一种动态的方式,接受任何类型的[Name]ViewModel
类。我确实尝试了一些使用类的方法,但是我不再有代码了。我也尝试过搜索,但没有得到好的结果。也许我没有找到合适的术语。非常感谢您的指导。最近我遇到了同样的问题,我发现了一个通用ViewModelFactory
,它是java,但是
@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@NonNull
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
现在,您对上面的类感兴趣的应该是AppModule.class
@Module(includes = {UserModelModule.class /* other model modules */})
public class AppModule {
// --- DATABASE INJECTION ---
@Provides
@Singleton
YourDatabase provideDatabase(Application application) {
return Room.databaseBuilder(application,
YourDatabase.class, "YourDatabase.db")
//.allowMainThreadQueries() // do NOT DO THIS IN REAL APPLICATIONs
.fallbackToDestructiveMigration()
.build();
}
@Provides
@Singleton
UserDao provideUserDao(YourDatabase database) { return database.userDao(); }
.
.
// other Daos that you will have (the above is an example from [https://developer.android.com/jetpack/docs/guide]
最后,我想您会想看看ModelModule类是什么样子的
@Module
public abstract class UserModelModule {
@Binds
@IntoMap
@ViewModelKey(UserViewModel.class)
abstract ViewModel bindUserProfileViewModel(UserViewModel repoViewModel);
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
}
有趣。关于databaseBuilder
,我应该把它放在那里吗?请帮助我,我对这件事还不熟悉,它让我很困惑,太多的代码对我来说毫无意义。我应该把房间
数据库实例放在哪里?嗯,嗯。。在这种情况下,你应该放轻松。看一看并完整地阅读这篇文章。很遗憾,它没有显示任何关于房间的内容。databaseBuilder
仍然,一开始很难。我的意思是,我理解了这个想法,但是找到好文章来解释一个更完整但更简单的应用程序构建方法是很困难的。我发现的例子总是不完整的。
@Singleton
@Component(modules={ActivityModule.class, FragmentModule.class, AppModule.class})
public interface AppComponents {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponents build();
}
void inject(Weather weatherApp);
}
@Module(includes = {UserModelModule.class /* other model modules */})
public class AppModule {
// --- DATABASE INJECTION ---
@Provides
@Singleton
YourDatabase provideDatabase(Application application) {
return Room.databaseBuilder(application,
YourDatabase.class, "YourDatabase.db")
//.allowMainThreadQueries() // do NOT DO THIS IN REAL APPLICATIONs
.fallbackToDestructiveMigration()
.build();
}
@Provides
@Singleton
UserDao provideUserDao(YourDatabase database) { return database.userDao(); }
.
.
// other Daos that you will have (the above is an example from [https://developer.android.com/jetpack/docs/guide]
@Module
public abstract class UserModelModule {
@Binds
@IntoMap
@ViewModelKey(UserViewModel.class)
abstract ViewModel bindUserProfileViewModel(UserViewModel repoViewModel);
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
}