[英]How to replace LiveData with Flow
我有一個名為sortOrder
的LiveData
,然后我有另一個名為myData
的變量,它觀察對sortOrder
的任何更改並相應地填充數據。
class TestViewModel @ViewModelInject constructor() : ViewModel() {
private val sortOrder = MutableLiveData<String>()
val myData = sortOrder.map {
Timber.d("Sort order changed to $it")
"Sort order is $it"
}
init {
sortOrder.value = "year"
}
}
在活動中觀察
class TestActivity : AppCompatActivity() {
private val viewModel: TestViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
// Observing data
viewModel.myData.observe(this) {
Timber.d("Data is : $it")
}
}
}
題
Flow/StateFlow
API 替換上述場景?如果您無法將映射的冷流轉換為熱流,它會在您每次收集它時重新啟動流(就像重新創建 Activity 時一樣)。 這就是冷流的工作原理。
我有一種感覺,他們會充實 StateFlow/SharedFlow 的轉換函數,因為將它們轉換為冷流並不得不將它們轉回熱流感覺非常尷尬。
如果您不想手動 map 明確第一個元素,則公共 Flow 必須是 SharedFlow,因為stateIn
function 要求您直接提供初始 state。
private val sortOrder = MutableStateFlow("year")
val myData = sortOrder.map {
Timber.d("Sort order changed to $it")
"Sort order is $it"
}.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
或者您可以創建一個單獨的 function,它在map
中調用,也在stateIn
function 調用中調用。
private val sortOrder = MutableSharedFlow<String>()
private fun convertSortOrder(order: String): String {
Log.d("ViewModel", "Sort order changed to $order")
return "Sort order is $order"
}
val myData = sortOrder.map {
convertSortOrder(it)
}.stateIn(viewModelScope, SharingStarted.Eagerly, convertSortOrder("year"))
我有一個名為sortOrder
的LiveData
,然后我有另一個名為myData
的變量,它觀察對sortOrder
的任何更改並相應地填充數據。
class TestViewModel @ViewModelInject constructor() : ViewModel() {
private val sortOrder = MutableLiveData<String>()
val myData = sortOrder.map {
Timber.d("Sort order changed to $it")
"Sort order is $it"
}
init {
sortOrder.value = "year"
}
}
在活動中觀察
class TestActivity : AppCompatActivity() {
private val viewModel: TestViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
// Observing data
viewModel.myData.observe(this) {
Timber.d("Data is : $it")
}
}
}
問題
Flow/StateFlow
API 替換上述場景?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.