如何优化 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 引用。
我有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 引用。