Отменить/Повторить, как обрабатывать doOnTextChanged и doBeforeTextChanged в TextField Jetpack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Отменить/Повторить, как обрабатывать doOnTextChanged и doBeforeTextChanged в TextField Jetpack Compose?

Сообщение Anonymous »

Мне нужно реализовать повтор/отмену действия для TextField в Jetpack Compose. Для EditText я использовал этот, и он работал хорошо. Однако для Jetpack Compose такого прослушивателя нет. Я бы реализовал собственный метод на основе этого для EditText, но мне не хватает этих двух методов прослушивания, которые недоступны для TextField:
doOnTextChanged { text, start, before, count -> }
doBeforeTextChanged { text, start, count, after -> }

В TextField можно использовать только один прослушиватель
onValuesChange = { }

что возвращается только строка без start и count.
Как мне добиться повтора/отмены для реализации TextField в Jetpack Compose?
Изменить
Это то, что я делал до сих пор. Было бы здорово сделать его работоспособным:
class EditTextDo {

private var mIsUndoOrRedo = false
private val editHistory: EditHistory? = null

fun redo() {
val edit = editHistory?.getNext() ?: return

// Do Redo
}

fun undo() {
val edit = editHistory?.getPrevious() ?: return

// Do Undo
}

fun canUndo(): Boolean {
editHistory?.let {
return it.position > 0
}
return false
}

fun canRedo(): Boolean {
editHistory?.let {
return it.position < it.history.size
}
return false
}

}

class EditHistory {

var position = 0

private var maxHistorySize = -1

val history = LinkedList()

private fun clear() {
position = 0
history.clear()
}

fun add(item: EditItem) {
while (history.size > position) {
history.removeLast()
}
history.add(item)
position++
if (maxHistorySize >= 0)
trimHistory()
}

fun getNext(): EditItem? {
if (position >= history.size) {
return null
}
val item = history[position]
position++
return item
}

fun getPrevious(): EditItem? {
if (position == 0) {
return null
}
position--
return history[position]
}

private fun setMaxHistorySize(maxHistorySize: Int) {
this.maxHistorySize = maxHistorySize
if (maxHistorySize >= 0)
trimHistory()
}

private fun trimHistory() {
while (history.size > maxHistorySize) {
history.removeFirst()
position--
}
if (position < 0)
position = 0
}
}

data class EditItem(val start: Int, val before: CharSequence, val after: CharSequence)


Подробнее здесь: https://stackoverflow.com/questions/734 ... xtfield-of
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»