2

我有一个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 变量将其传递给视图时开始它。

4

0 回答 0