如何优化 viewModel 工厂代码?

How to optimize viewModel factories code?

我有abstract class BaseViewmodel(uiActions: UiActions) : ViewModel(), UiActions by uiActions
项目中的所有 ViewModel 扩展 BaseViewModel 例如,我的 2 个 ViewModel(没有主体):

class SearchViewModel(uiActions: UiActions) : BaseViewModel(uiActions)

class HistoryViewModel(uiActions: UiActions) : BaseViewModel(uiActions)

uiActions: UiActions外,所有viewModels都没有任何参数 所以,工厂几乎是相似的,区别仅在于 class 名称。例如:

class SearchViewModelFactory(private val uiActions: UiActions) : ViewModelProvider.Factory {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T =
        SearchViewModel(uiActions = uiActions) as T
}

class HistoryViewModelFactory(private val uiActions: UiActions) : ViewModelProvider.Factory {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T =
        HistoryViewModel(uiActions = uiActions) as T
}

我可以创建 1 个工厂并在任何地方使用它吗?

您可以编写可用于多种不同 ViewModel 类型的工厂。这就是为什么 create 函数有一个 Class 参数:

class UiActionsViewModelFactory(private val uiActions: UiActions) : ViewModelProvider.Factory {
    
    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T = when (modelClass) {
        SearchViewModel::class.java -> SearchViewModel(uiActions)
        HistoryViewModel::class.java -> HistoryViewModel(uiActions)
    }

}

我不确定 UiActions 是什么,但要小心避免泄漏对 ViewModel 的任何 view/activity/fragment 引用。