将流观察为Compose字符串状态



我有一个可组合的视图模型(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.titleviewModel.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)

相关内容

  • 没有找到相关文章

最新更新