MetroViewModelFactory
Factory class for creating ViewModel instances and their assisted factories.
This can be provided on a DI graph and then installed wherever a default ViewModelProvider.Factory is expected. It can be helpful to use in tandem with ViewModelGraph.
Below is the recommended installation, where you subclass this class and contribute an injected binding. You can override whichever provider maps you need to support.
@DependencyGraph(AppScope::class)
interface MyGraph : ViewModelGraph
@Inject
@ContributesBinding(AppScope::class)
@SingleIn(AppScope::class)
class MyViewModelFactory(
override val viewModelProviders: Map<KClass<out ViewModel>, Provider<ViewModel>>,
override val assistedFactoryProviders: Map<KClass<out ViewModel>, Provider<ViewModelAssistedFactory>>,
override val manualAssistedFactoryProviders: Map<KClass<out ManualViewModelAssistedFactory>, Provider<ManualViewModelAssistedFactory>>,
): MetroViewModelFactory()
// Compose installation
@Composable
class AppEntry(metroVmf: MetroViewModelFactory) {
CompositionLocalProvider(LocalMetroViewModelFactory provides metroVmf) {
App(...)
}
}
// Activity installation
@Inject
class ExampleActivity(private val viewModelFactory: MyViewModelFactory) : ComponentActivity() {
override val defaultViewModelProviderFactory: ViewModelProvider.Factory
get() = viewModelFactory
}
// Fragment installation
@Inject
class ExampleFragment(private val viewModelFactory: MyViewModelFactory) : Fragment() {
override val defaultViewModelProviderFactory: ViewModelProvider.Factory
get() = viewModelFactory
}The class manages two maps:
viewModelProviders: A map of KClass to Provider of ViewModels, used to instantiate standard constructor-injected ViewModels.
assistedFactoryProviders: A map of KClass to a Provider of ViewModelAssistedFactory instances, used to create ViewModels that require assisted creation with CreationExtras. This map is always tried first.
The keys for both maps are the target ViewModel class.
If neither map contains the requested ViewModel class, an IllegalArgumentException is thrown.