Моя ViewModelFactory :
class ViewModelFactory @Inject constructor(
private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle?
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Throws(IllegalStateException::class)
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
return viewModelMap[modelClass]?.create(handle) as? T ?: throw IllegalStateException("Unknown ViewModel class")
}
}
Активность :
@Inject
lateinit var viewModelFactory: ViewModelFactory
protected val viewModel: ViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(getViewModelClass()) }
ViewModel :
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
И мне было интересно, как я могу динамически предоставлять defaultArgs вместо:
ActivityModule
@Module
companion object {
@JvmStatic
@Nullable
@Provides
fun provideDefaultArgs(): Bundle? {
return null
}
}
Идея состоит в том, чтобы иметь возможность отправлять параметр для ViewModel, скажем, идентификатор для DetailActivity. Обычно я использую метод "init", но если бы я мог использовать StateHandle map
, было бы еще лучше. Что-то вроде это и это .
Имеет смысл? Возможно ли это?