我有一个StateFlow
我想与 Android 数据绑定一起使用的。作为流程中的值,我使用密封类型:
data class State(
val idState: IdState
) : UiState
sealed class IdState {
object NotAssigned : IdState()
data class Assigned(val id: Id) : IdState()
}
@JvmInline
value class Id(val value: String)
我想像这样在视图中使用它:
<com.google.android.material.textfield.TextInputLayout
...
android:hint="@string/provide_client_id"
android:text="@{viewModel.idText}">
所以在视图模型中我有:
// uiState can be StateFlow or MutableStateFlow of UiState
val idText = uiState.map { state ->
when (val idState = state.idState) {
is UserIdState.Assigned -> idState.id.value
UserIdState.NotAssigned -> "Not set"
}
}
当我启动应用程序时出现问题:
Cannot find a setter for <com.google.android.material.textfield.TextInputLayout android:text> that accepts parameter type 'kotlinx.coroutines.flow.Flow<java.lang.String>'
问题当然是map
操作符将类型更改为StateFlow
无法Flow
在 Android 数据绑定中使用。有没有办法映射StateFlow
值而不将其转换为Flow
?我知道有一个stateIn
运算符Flow
,但我不太确定它是否缩进(StateFlow
-> Flow
-> StateFlow
)以及如何在viewModelScope
通过 ViewModel 变量将其传递给视图时开始它。