问题描述
我有一个名为sortOrder
的LiveData
,然后有另一个名为myData
的变量,它观察到sortOrder
的任何变化并相应地填充数据.
I've one LiveData
named sortOrder
and then I've another variable named myData
that observes any change to sortOrder
and populates data accordingly.
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替换上述情况?
- How can I replace the above scenario with
Flow/StateFlow
APIs without any change in output?
推荐答案
如果您无法将映射的冷流程转换为热流程,则每次收集该流程时,它将重新启动该流程(例如重新创建Activity时).这就是冷流的工作方式.
If you fail to convert the mapped cold Flow into a hot Flow, it will restart the flow every time you collect it (like when your Activity is recreated). That's how cold flows work.
我有一种感觉,他们会充实StateFlow/SharedFlow的转换函数,因为将它们映射为冷流并将其重新转换为热流感到很尴尬.
I have a feeling they will flesh out the transform functions for StateFlow/SharedFlow, because it feels very awkward to map them to cold flows and have to turn them back into hot flows.
如果您不想明确地手动映射第一个元素,则公共流程必须是SharedFlow,因为stateIn
函数要求您直接提供初始状态.
The public Flow has to be a SharedFlow if you don't want to manually map the first element distinctly because the stateIn
function requires you to directly provide an initial 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)
或者您可以创建在map
中以及在stateIn
函数调用中调用的单独函数.
Or you could create a separate function that is called within map
and also in a stateIn
function call.
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"))
这篇关于如何用Flow替换LiveData的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!