Jetpack Compose – Как выполнить подъем состояния для проанализированного сложного объекта?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Jetpack Compose – Как выполнить подъем состояния для проанализированного сложного объекта?

Сообщение Anonymous »


Итак, в моем наборе данных я храню специальную строку. Эта строка должна быть преобразована в дерево для манипуляций со стороны пользователя (просмотр, редактирование, удаление, объединение, добавление узлов и т. д.). Для добавления и удаления узла мне нужно получить позицию курсора из активного текстового поля. На каждом этапе манипуляции я преобразую дерево обратно в его строковое представление и сохраняю его в наборе данных, что запускает обновления пользовательского интерфейса и т. д.

Однако теперь у меня есть три разных источника истины:
[*]ViewModel, содержащий поток состояний из базы данных неразобранной строки
private val _uiState = MutableStateFlow(MyUnparsedStringFromDB()) val uiState: StateFlow = _uiState.asStateFlow() [*]mutableStateOf, содержащий объект дерева в TreeComponent @Composable забавный TreeComponent( модификатор: Модификатор = Модификатор, unparsedString: Строка, onValueChange: (String) -> Единица измерения, ) { var root: MyTreeNode, запомнив {mutableStateOf(unparsedString.toTree()) } val onNodeValueChange: (MyTreeNode, String) -> Unit = { node, newValue -> node.text = новое значение onValueChange(root.toString()) } ... // рекурсивная логика для вызова NodeComponent на каждом узле NodeComponent (узел, onNodeValueChange) ... } [*]mutableStateOf, содержащий текстовое поле текущего узла в NodeComponent @Composable весело NodeComponent( модификатор: Модификатор = Модификатор, узел: MyTreeNode, onNodeValueChange: (MyTreeNode, String) -> Единица измерения, ) { var textState по памяти {mutableStateOf(TextFieldValue(node.text)) } Базовоетекстовое поле( значение = текстовое состояние, onValueChange = { onNodeValueChange (узел, it.text) textState = это } // ... ) } Изначально это отлично работало, когда моей целью было отрисовать это дерево или отредактировать поле node.text. Но как только я пытаюсь выполнить более сложные операции, такие как разделение, добавление, удаление и слияние узлов, это становится ОГРОМНОЙ головной болью.

Например, сейчас, когда я пытаюсь разделить узел пополам в текущей позиции курсора, дерево полностью обновляется, как и ожидалось, и правильное строковое представление сохраняется в наборе данных. Но обновление состояния textfield не запускается, пока я не выйду из пользовательского интерфейса и не вернусь к нему. Я попытался принудительно обновить, переопределив функцию MyTreeNode.equals, чтобы всегда выводить false, как предложено в этом ответе, но это не сработало

Итак, как мне правильно выполнить подъем состояния, если рассматриваемый объект сложный?
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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