【发布时间】:2021-04-15 00:33:39
【问题描述】:
我有一个名为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/StateFlowAPI 替换上述场景?
【问题讨论】:
-
您是否可以选择使用 asLiveData 将 Flow 映射到 LiveData?
-
是的,我可以在活动中做到这一点。问题是如果我将 StateFlow 用于
sortOrder,则每次重新创建活动时都会触发map主体。 -
@theapache64 为什么不在视图模型中使用 livedata 转换并将流作为 livedata 暴露给视图?
-
@CyberShark 重点是让虚拟机 liveData 免费。
-
没有解决方案在行为上是正确的,除非它依赖于 SavedStateHandle,但获取 SavedStateHandle 更改通知的唯一安全方法是使用 SavedStateHandle.getLiveData。如果您想保持 LiveData-free,请不要使用 ViewModel。
标签: android kotlin kotlin-coroutines kotlinx.coroutines.flow