Compose NavController протекаетAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Compose NavController протекает

Сообщение Anonymous »

Я добавляю ComposeView прямо в корень активности (именно так я запускаю ModalBottomsheetLayout из представления xml, пример ниже упрощен, но все же воспроизводим)
Вот весь фрагмент воспроизводимого примера:

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

class TestFragment : Fragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(
ViewCompositionStrategy
.DisposeOnViewTreeLifecycleDestroyed,
)
setContent {
LazyColumn(
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally,
) {
item {
ListItem(title = "launchBS") { launchBS() }
}
item {
ListItem(title = "closeBS") {
activity
?.findViewById(android.R.id.content)
?.let { viewGroup ->
val viewToRemove = viewGroup.findViewWithTag(BS_VIEW_TAG)
viewToRemove?.disposeComposition()
viewGroup.removeView(viewToRemove)
}
}
}
}
}
}
}

private fun launchBS() {
activity
?.findViewById(android.R.id.content)
?.let { viewGroup ->
val composeView = ComposeView(viewGroup.context).apply {
ComposeView(viewGroup.context).apply {
setViewCompositionStrategy(
ViewCompositionStrategy.DisposeOnDetachedFromWindow
)
}
setContent {
val navController = rememberNavController()
NavHost(navController, startDestination = DEFAULT_DESTINATION) {
composable(DEFAULT_DESTINATION) {
Text(text = "COMPOSE BOTTOMSHEET IS DISPLAYING")
}
}
DisposableEffect(Unit) {
onDispose {
navController.popBackStack(DEFAULT_DESTINATION, true)
}
}
}
tag = BS_VIEW_TAG
}
viewGroup.addView(
composeView
)
}
}
Объяснение:
  • когда я нажимаю «запуститьBS» — ComposeView добавляется в действие, которое содержит NavHost для будущей области видимости модели и т. д.
  • когда я нажимаю «закрытьBS» - я извлекаю стек NavController и удаляю ComposeView из активности.
Проблема:
  • при удалении ComposeView - NavHostController все равно выделяется в памяти. Например, когда я открываю/закрываю 5 раз, у меня есть 5 распределений. Освобождение происходит только при уничтожении активности.
Вопросы:
  • Это предназначено поведение NahHost / NavController?
  • Существует ли исправление или обходной путь для уничтожения NavController и связанных с ним выделений NavHost, даже если активность все еще активна?
Изображение


Подробнее здесь: https://stackoverflow.com/questions/791 ... is-leaking
Ответить

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

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

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

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

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