Skip to content

Introduce TextController.asMutableTextFieldValueState() #729

Open
@rjrjr

Description

@rjrjr

Oops, forgot to open source this:

/**
 * A wrapper extension for [com.squareup.workflow1.ui.compose.asMutableState] that returns
 * [TextFieldValue].
 */
@Composable
fun TextController.asMutableTextFieldValueState(): MutableState<TextFieldValue> {
  var textControllerValue by asMutableState()

  var textFieldValue by remember(this) {
    mutableStateOf(
      TextFieldValue(
        text = textControllerValue,
        // We need to set the selection manually when creating  new `TextFieldValue` whenever
        // `TextController` changes because the text inside may not be empty. This is to ensure the
        // cursor is set at the end of this new text.
        selection = TextRange(textControllerValue.length)
      )
    )
  }

  // "Bridge" mutable state between the two mutable states above. This also needs to depend on `this`
  // key so that the mutable state is recomputed whenever `textFieldValue` is updated. This ensures the
  // most up-to-date reference to `textFieldValue` used by this bridge mutable state.
  return remember(this) {
    object : MutableState<TextFieldValue> {
      override var value: TextFieldValue
        get() = textFieldValue
        set(newValue) {
          textFieldValue = newValue
          textControllerValue = newValue.text
        }

      override fun component1(): TextFieldValue = value
      override fun component2(): (TextFieldValue) -> Unit = { value = it }
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    composeuiRelated to UI integration

    Type

    No type

    Projects

    • Status

      To do

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions