Android 如何从AbstractSavedStateViewModelFactory动态设置捆绑包

Android 如何从AbstractSavedStateViewModelFactory动态设置捆绑包,android,dagger-2,android-lifecycle,android-viewmodel,viewmodel-savedstate,Android,Dagger 2,Android Lifecycle,Android Viewmodel,Viewmodel Savedstate,MyViewModelFactory: class ViewModelFactory @Inject constructor( private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>, owner: SavedStateRegistryOwner, defaultArgs: Bundle? )

MyViewModelFactory

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()) }
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
视图模型

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()) }
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
这样做的目的是可以向ViewModel发送一个参数,比如说一个DetailActivity的ID。 通常我使用“init”方法,但是如果我可以使用
stateholder映射
就更好了。有点像和


有道理吗?有可能吗?

我遇到了两种解决方案:

解决方案A:

将ViewModelFactory更改为:

class ViewModelFactory @Inject constructor(
    private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>
) {
    fun create(owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null): AbstractSavedStateViewModelFactory {
        return object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
            @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")
            }
        }
    }
}
此外,我们可以将ActivityModule简化为(示例):

创建我们的
ViewModelAssistedFactory
如下:

class HelloWorldViewModelFactory @Inject constructor(
    private val dependencyA: DependencyA,
    ...
) : ViewModelAssistedFactory<HelloWorldViewModel> {
    override fun create(stateHandle: SavedStateHandle): HelloWorldViewModel {
        return HelloWorldViewModel(stateHandle, dependencyA, ...)
    }
}

Elye的这篇文章有助于解决这个问题。

这听起来可能很疯狂,但听起来你需要通过AssistedInject提供
ViewModelProvider.Factory
。我们不应该像对待
ViewModelAssisteFactory
一样尝试
AssistedInject
捆绑包吗?没错。要获取通过
AssistedInject
传入的
捆绑包的
AbstractSavedStateViewModelFactory
实例,您将通过辅助注入创建VMFactory。您能回答这个问题吗
class HelloWorldViewModelFactory @Inject constructor(
    private val dependencyA: DependencyA,
    ...
) : ViewModelAssistedFactory<HelloWorldViewModel> {
    override fun create(stateHandle: SavedStateHandle): HelloWorldViewModel {
        return HelloWorldViewModel(stateHandle, dependencyA, ...)
    }
}
@Inject
lateinit var factory: HelloWorldViewModelFactory
private val viewModel: HelloWorldViewModel by viewModels { ViewModelFactoryAlt(factory, this, intent.extras) }