1 package com.airbnb.lottie.sample.compose.dagger 2 3 import androidx.activity.ComponentActivity 4 import com.airbnb.lottie.sample.compose.LottieComposeApplication 5 import com.airbnb.mvrx.MavericksState 6 import com.airbnb.mvrx.MavericksViewModel 7 import com.airbnb.mvrx.MavericksViewModelFactory 8 import com.airbnb.mvrx.ViewModelContext 9 daggerMavericksViewModelFactorynull10inline fun <reified VM : MavericksViewModel<S>, S : MavericksState> daggerMavericksViewModelFactory() = 11 DaggerMavericksViewModelFactory<VM, S>(VM::class.java) 12 13 14 class DaggerMavericksViewModelFactory<VM : MavericksViewModel<S>, S : MavericksState>( 15 private val viewModelClass: Class<out MavericksViewModel<S>> 16 ) : MavericksViewModelFactory<VM, S> { 17 18 override fun create(viewModelContext: ViewModelContext, state: S): VM { 19 return createViewModel(viewModelContext.activity, state) 20 } 21 22 private fun <VM : MavericksViewModel<S>, S : MavericksState> createViewModel( 23 fragmentActivity: ComponentActivity, 24 initialState: S 25 ): VM { 26 val viewModelFactoryMap = (fragmentActivity.application as LottieComposeApplication).component.viewModelFactories() 27 val viewModelFactory = viewModelFactoryMap[viewModelClass] 28 29 @Suppress("UNCHECKED_CAST") 30 val castedViewModelFactory = viewModelFactory as? AssistedViewModelFactory<VM, S> 31 val viewModel = castedViewModelFactory?.create(initialState) 32 return viewModel as VM 33 } 34 }