Jetpack Compose – Как выполнить подъем состояния для проанализированного сложного объекта? ⇐ Android
Jetpack Compose – Как выполнить подъем состояния для проанализированного сложного объекта?
Итак, в моем наборе данных я храню специальную строку. Эта строка должна быть преобразована в дерево для манипуляций со стороны пользователя (просмотр, редактирование, удаление, объединение, добавление узлов и т. д.). Для добавления и удаления узла мне нужно получить позицию курсора из активного текстового поля. На каждом этапе манипуляции я преобразую дерево обратно в его строковое представление и сохраняю его в наборе данных, что запускает обновления пользовательского интерфейса и т. д.
Однако теперь у меня есть три разных источника истины:
[*]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, как предложено в этом ответе, но это не сработало
Итак, как мне правильно выполнить подъем состояния, если рассматриваемый объект сложный?
Итак, в моем наборе данных я храню специальную строку. Эта строка должна быть преобразована в дерево для манипуляций со стороны пользователя (просмотр, редактирование, удаление, объединение, добавление узлов и т. д.). Для добавления и удаления узла мне нужно получить позицию курсора из активного текстового поля. На каждом этапе манипуляции я преобразую дерево обратно в его строковое представление и сохраняю его в наборе данных, что запускает обновления пользовательского интерфейса и т. д.
Однако теперь у меня есть три разных источника истины:
[*]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, как предложено в этом ответе, но это не сработало
Итак, как мне правильно выполнить подъем состояния, если рассматриваемый объект сложный?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Добавить имя проанализированного файла в электронное письмо (проверка журнала)
Anonymous » » в форуме Apache - 0 Ответы
- 65 Просмотры
-
Последнее сообщение Anonymous
-