如何从另一个视图模型中的视图模型访问函数
我有 2 个视图模型 -
- 主视图模型**
- 存储视图模型
存储视图模型.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函数
主视图模型.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表现得像 aRepository它不应该扩展ViewModel。如果它没有与 UI 的连接,您可以将其转换为存储库类,这将解决您的问题,因为它只会成为可注入的单例。
如果StorageViewModel连接到一个片段(例如),您应该引用两个视图模型并从 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)
}
}
}
}