在我的应用程序中,我有一个 ViewModel 委托,它在我的一些 ViewModel 之间共享(在导航图的范围内)。
示例:ViewModelDelegate 仅获取一次筛选项,并在包含两个屏幕(FirstScreen 和 SecondScreen)的导航图中接收用户交互事件,其中每个屏幕都有自己的 ViewModel(不共享)。
interface FilterViewModelDelegate {
val filterItems: StateFlow<FilterItem>
fun initFilterViewModelDelegate(
savedStateHandle: SavedStateHandle,
viewModelScope: CoroutineScope
)
fun onFilterItemClicked(filterItemId: String)
}
class FilterViewModelDelegateImpl : FilterViewModelDelegate {
private lateinit var savedStateHandle: SavedStateHandle
private lateinit var viewModelScope: CoroutineScope
private val _filterItems = MutableStateFlow<FilterItem>(emptyList())
override val filterItems = _filterItems.asStateFlow()
override fun initFilterViewModelDelegate(
savedStateHandle: SavedStateHandle,
viewModelScope: CoroutineScope
) {
this.savedStateHandle = savedStateHandle
this.viewModelScope = viewModelScope
// fetch the filter items and so on
}
override fun onFilterItemClicked(filterItemId: String) {
// implementation...
}
// implementation...
}
@HiltViewModel
class FirstViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
filterViewModelDelegate: FilterViewModelDelegate
) : ViewModel(), FilterViewModelDelegate by filterViewModelDelegate {
init {
initFilterViewModelDelegate(
viewModelScope = viewModelScope,
savedStateHandle = savedStateHandle
)
// implementation...
}
// implementation...
}
@HiltViewModel
class SecondViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
filterViewModelDelegate: FilterViewModelDelegate
) : ViewModel(), FilterViewModelDelegate by filterViewModelDelegate {
init {
initFilterViewModelDelegate(
viewModelScope = viewModelScope,
savedStateHandle = savedStateHandle
)
// implementation...
}
// implementation...
}
这是共享 ViewModel 特定部分的功能和数据的好方法吗?
如果是这样,为该示例设置匕首柄的正确方法是什么?
如果没有,你会推荐什么?
是的,这是在寿命较短的物体之间分享寿命较长的东西的好方法。
您可以在
@Singleton
上添加 FilterViewModelDelegate
注释以使 ViewModel 共享同一个实例吗?