Two-way data binding with StateFlow & BindingAdapters //Dev Diary

I created BindingAdapters for an EditText like so:

@BindingAdapter("android:text")
fun setText(editText: EditText, inputAmount: MutableStateFlow<Double>) {
    if (editText.text.toString() != inputAmount.value.toString()) {
        editText.setText(inputAmount.value.toString())
        editText.setSelection(editText.text.length)
    }
}

@InverseBindingAdapter(attribute = "android:text")
fun getText(editText: EditText): Double {
    if (editText.text.isEmpty()) return 0.0
    return editText.text.toString().toDouble()
}

My XML layout element looks like this:

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/tiet_input_amount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/input_hint_amount"
                android:inputType="numberDecimal"
                android:text="@={viewModel._inputAmount}" />

And in my ViewModel, the inputAmount is set up this way:

    val _inputAmount: MutableStateFlow<Double> = MutableStateFlow(0.0)
    val inputAmount: StateFlow<Double> = _inputAmount

Related Posts

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *