如何在不同的ViewModel之间正确共享ViewModel Delegate?

问题描述 投票:0回答:1

在我的应用程序中,我有一个 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 特定部分的功能和数据的好方法吗?

如果是这样,为该示例设置匕首柄的正确方法是什么?

如果没有,你会推荐什么?

android delegates android-viewmodel dagger-hilt
1个回答
0
投票

是的,这是在寿命较短的物体之间分享寿命较长的东西的好方法。

您可以在

@Singleton
上添加
FilterViewModelDelegate
注释以使 ViewModel 共享同一个实例吗?

© www.soinside.com 2019 - 2024. All rights reserved.