gpt4 book ai didi

android - 如何从另一个 viewModel 中的 viewModel 访问函数

转载 作者:行者123 更新时间:2023-12-05 00:13:08 29 4
gpt4 key购买 nike

我有 2 个 View 模型 -

  1. 主视图模型**
  2. 存储 View 模型

StorageViewModel.kt

class StorageViewModel @ViewModelInject constructor(private val preferenceStorage: 
PreferenceStorage, @ApplicationContext context: Context) : ViewModel() {

........
//save last played song
fun saveLastPlayedSong(song: Songs){
viewModelScope.launch {
protoDataStoreManager.saveLastPlayedSong(song)
}
}

}

现在,我想在 MainViewModel 中调用 saveLastPlayedSong 函数

MainViewModel.kt

class MainViewModel @ViewModelInject constructor(
private val musicServiceConnection: MusicServiceConnection,
private val storageViewModel: StorageViewModel
) : ViewModel(){

.........

fun playOrToggleSong(
mediaItem: Songs, toggle: Boolean = false
)
{
//here, I want to call the function from StorageViewModel e.g
storageViewModel.saveLastPlayedSong(mediaItem)
}
}

如何在 MainViewModel 中实例化“StorageViewModel”,什么是最佳方法(良好实践)。

我正在使用 MVVM 和 Hilt。

最佳答案

这通常是不良架构的症状。

如果 StorageViewModel 的行为类似于 Repository,则它不应扩展 ViewModel。如果它没有与 UI 的连接,您可以将它转换为存储库类,这将解决您的问题,因为它会变成一个可注入(inject)的单例。

如果 StorageViewModel 连接到 fragment (例如),您应该引用两个 View 模型并从 UI 层在它们之间传递数据。

类似于:

class StorageFragment : Fragment {
private val storageViewModel: StorageViewModel by viewModels()
private val mainActivityViewModel: MainViewModel by activityViewModels()

//....

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//you can do this if the song saving is a UI related thing
//just have playOrToggleSong accept a function as parameter
//as success callback
button.setOnClickListener {
mainActivityViewModel.playOrToggleSong(...) {
storageViewModel.saveLastPlayedSong(param)
}
}
}
}

关于android - 如何从另一个 viewModel 中的 viewModel 访问函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68401486/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com