Архитектура Jetpack Compose с рекурсивными экранами, использующими глубокие ссылки и утечки памятиAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Архитектура Jetpack Compose с рекурсивными экранами, использующими глубокие ссылки и утечки памяти

Сообщение Anonymous »

Я построил архитектуру, основанную на компоновке Jetpack, и по возможности не хочу использовать Flows. Данные имеют древовидную структуру; на основе требований и выбора; которые отображаются в LazyList на основе заголовка раздела; где Требование отображается как заголовок раздела, а Выбор — это элементы списка. Чтобы избежать циклических ссылок, я создал еще один класс под названием «Условия», который используется для отслеживания состояний выбора и того, соответствует ли раздел требованиям и является ли он действительным/недействительным состоянием. Я создал что-то вроде этого

Код: Выделить всё

abstract class Selection(
val name: String,
val condition: Condition,
val selectionMinValue: Int,
val selectionMaxValue: Int
) : ComposeRender, Validatable by condition, Parcelable {

var selectionValidationState by mutableStateOf(ValidationState.CORRECT)
var selectionHeaderListPosition: Int = 0

@Composable
abstract override fun render()

override fun check(): ValidationState {
return if (condition.currentQuantity in selectionMinValue..selectionMaxValue) {
ValidationState.CORRECT
} else if (condition.currentQuantity < selectionMinValue) {
ValidationState.NOT_ENOUGH
} else {
ValidationState.TOO_MANY
}
}
}
Теперь я обеспокоен тем, что это негерметично; и это все, что вспоминается; который все еще находится в структуре данных дерева; должен находиться в области ViewModel. Насколько я понимаю, это нормально; и что запоминание свойства, находящегося в области ViewModel, не должно привести к утечке Composable. Правильно ли это?
Было бы безопасно, если бы при создании объектов Selection я использовал viewModel.condition; где свойство находится в viewModel? Эта модель представления будет сохраняться на всех экранах; поскольку все данные взаимосвязаны; поскольку вложенным экранам и экранам захвата необходим доступ к данным, находящимся на разных уровнях; пройти весь путь через Дерево; для каждого экрана. Я не возражаю против утечки всего дерева данных, пока не происходит утечка представлений.
Будет ли утечка представления, созданного Composable, из-за того, что оно запоминает свойство внешнего класса, и этот внешний класс существует в древовидной структуре; который сохраняется на всех экранах? Есть ли способ обойти эту проблему?
Я хочу использовать эти ComposeRenders в качестве аргументов для моего NavHost, поэтому простая передача значений в функцию @Composable невозможна. не отличный вариант. Я рассматриваю возможность перемещения Composable за пределы объекта Selection; и вместо этого использовать какой-либо служебный класс в модели представления с такой функцией, как renderSelection; и когда вызывается renderSelection, он будет делать что-то вроде renderSelection(viewModel.selection);, а затем функция запоминания будет в области функции @Composable.
Или я мог бы использовать статическую функцию для renderSelection, чтобы снова ни на одно свойство в дереве не ссылался @Composable, на который ссылается объект в дереве.
/>Спасибо. Надеюсь, этот вопрос поможет другим людям, столкнувшимся с той же ситуацией!

Подробнее здесь: https://stackoverflow.com/questions/785 ... and-memory
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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