Skip to content

Instantly share code, notes, and snippets.

public class ProjectViewModelFactory implements ViewModelProvider.Factory {
private final ArrayMap<Class, Callable<? extends ViewModel>> creators;
public ProjectViewModelFactory(ViewModelSubComponent viewModelSubComponent) {
creators = new ArrayMap<>();
creators.put(HomeFragmentViewModel.class, () -> viewModelSubComponent.homeFragmentViewModel());
creators.put(QueryViewModelArc.class, () -> viewModelSubComponent.queryViewModelArc());
}
@Override
@Subcomponent
public interface ViewModelSubComponent {
@Subcomponent.Builder
interface Builder {
ViewModelSubComponent build();
}
HomeFragmentViewModel homeFragmentViewModel();
QueryViewModelArc queryViewModelArc();
}
@Singleton
@Component(modules = {
ApplicationModule.class,
NetworkModule.class,
ShowRepositoryModule.class,
ResourceRepositoryModule.class
})
public interface ApplicationComponent {
// expose to sub graphs
@Module(subcomponents = {ViewModelSubComponent.class})
public class ApplicationModule {
@Singleton
@Provides
ProjectViewModelFactory provideViewModelFactory(
ViewModelSubComponent.Builder viewModelSubComponent) {
return new ProjectViewModelFactory(viewModelSubComponent.build());
}
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="package.QueryViewModelArc"/>
</data>
<FrameLayout
class QueryFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val queryViewModelArc = ViewModelProviders.of(this, viewModelFactory).get(QueryViewModelArc::class.java)
}
}
class ProjectViewModelFactory(viewModelSubComponent: ViewModelSubComponent) : ViewModelProvider.Factory {
private val creators: ArrayMap<Class<*>,() ->ViewModel> = ArrayMap()
init {
creators[HomeFragmentViewModel::class.java] = { viewModelSubComponent.homeFragmentViewModel() }
creators[QueryViewModelArc::class.java] = { viewModelSubComponent.queryViewModelArc() }
}
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var creator: (() ->ViewModel)? = creators[modelClass]
@Subcomponent
interface ViewModelSubComponent {
@Subcomponent.Builder
interface Builder {
fun build(): ViewModelSubComponent
}
fun homeFragmentViewModel(): HomeFragmentViewModel
fun queryViewModelArc(): QueryViewModelArc
}
@Singleton
@Component(modules = arrayOf(ApplicationModule::class, NetworkModule::class, ShowRepositoryModule::class, ResourceRepositoryModule::class))
interface ApplicationComponent {
// expose to sub graphs
fun showRepository(): ShowRepository
fun resourceRepository(): ResourceRepository
fun viewModelFactory(): ProjectViewModelFactory
class QueryViewModelArc @Inject
constructor(private val mSearchShows: SearchShows?) : ViewModel() {
val query = MutableLiveData<String>()
val searchEnabled = MutableLiveData<Boolean>()
init {
searchEnabled.value = false
query.value = ""