我對 Kotlin Flows 很陌生。正如標題所示,我基本上有 2 個共享一個 ViewModel 的片段。我想使用 SharedFlow 作為 LiveData 的替代品在它們之間發送資料而不保留它的狀態。
片段A
class FragmentA: Fragment() {
private lateinit var viewModelShared: SharedViewModel
//Others//
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModelShared = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
someView.setOnClickListener{
viewModelShared.sendData("Hello")}
//Fragment Navigates From Fragment A to B using NavController
navController.navigate(some_action_id)
}
}
片段B
class FragmentB: Fragment() {
private lateinit var viewModelShared: SharedViewModel
//Others//
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModelShared = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
lifecycleScope.launchWhenCreated {
viewModelMain.sharedFlow.collectLatest {
//Data or the word 'Hello' sent from Fragment A not being Received Here
}
}
}
共享視圖模型
class SharedViewModel:ViewModel() {
private val _sharedFlow= MutableSharedFlow<String>()
val sharedFlow= _sharedFlow.asSharedFlow()
fun sendData(data:String){
viewModelScope.launch {
_sharedFlow.emit(data)
}
}
}
uj5u.com熱心網友回復:
您的 FragmentB 僅在處于啟動狀態或更高狀態時收集。這是正確的,因為您不希望在視圖不可見且當前可能沒有視圖時使用它。
但是,由于您的 SharedFlow 沒有重播歷史記錄,這意味著 FragmentB 重新出現在螢屏上時沒有任何東西可以收集。據推測,當 FragmentA 更新流時它在螢屏外。
因此,當當前沒有收集器時,沒有重放的 SharedFlow 無關緊要,并且發出的值會被丟棄。您需要至少重播 1 次才能使其正常作業。
private val _sharedFlow= MutableSharedFlow<String>(replay = 1)
您提到了“不保留其狀態”,但是如果兩個片段不在同一時間出現在螢屏上,則在沒有狀態的情況下這是不可能的。
順便說一下,有一種更簡單的方法來宣告您的共享 ViewModel:
private val viewModelShared: SharedViewModel by activityViewModels()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375840.html
標籤:安卓 科特林 kotlin-flow
