我有一个可组合的视图模型(VM(。VM从kotlin流中获取一些数据,我想将其公开为状态
通常我会让虚拟机暴露这样的状态:
var title by mutableStateOf("")
private set
我可以把它用在像这样的堆肥中
Text(text = viewModel.title)
但由于数据来自流,我必须像这个一样公开它
@Composable
fun title() = flowOf("TITLE").collectAsState(initial = "")
必须在像这样的可堆肥中使用
Text(text = viewModel.title().value)
我尽量减少样板代码,所以.value
有点困扰我。有没有办法将流收集为状态,但仍然将其公开为viewModel.title
或viewModel.title()
,并获得实际的String而不是状态对象?
您可以使用委托属性。如果你的程序只是阅读它。
class FlowDeletedProperty<T>(val flow: Flow<T>, var initialValue: T, val scope: CoroutineScope) :
ReadOnlyProperty<ViewModel, T> {
private var _value = mutableStateOf(initialValue)
init {
scope.launch {
flow.collect {
_value.value = it
}
}
}
override fun getValue(thisRef: ViewModel, property: KProperty<*>): T {
return _value.value
}
}
fun <T> ViewModel.flowDeletedProperty(flow: Flow<T>, initialValue: T) =
FlowDeletedProperty(flow, initialValue, viewModelScope)
视图中型号
val a = flow {
while (true) {
kotlinx.coroutines.delay(100L)
println("out ")
emit((100..999).random().toString())
}
}
val title by flowDeletedProperty(a,"")
在ui 中
Text(text = viewModel.title)