Странное поведение onDispose в Jetpack ComposeAndroid

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

Сообщение Anonymous »

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

@Composable
fun AndroidViewContainer(modifier: Modifier = Modifier, int: () -> Int) {
int() // for causing recomposition
var view: View? = null

SideEffect {
println("Log sideeffect $view")
}
DisposableEffect(Unit) {
onDispose {
println("Log detached $view")
}
}

AndroidView(
modifier = modifier,
factory = { context ->
View(context).also {
println("Log factory")
view = it
}
},
update = {
println("Log: $view")
}
)
}
Имея код, подобный приведенному выше, я бы предположил, что при первой композиции вызывается обратный вызов фабрики и для представления устанавливается значение, отличное от нуля, но Представление. После рекомпозиции представление var: View? = null должен быть выполнен и переопределить представление, которое было установлено ранее, и значение представления должно снова быть нулевым.
Это верно для SideEffect или update, они получают нулевое значение. Но когда мы покидаем экран, вызывается onDispose, но не с нулевым значением, а с View, который был установлен в обратном вызове Factory.
И тут возникает вопрос: компилятор Compose каким-то образом оборачивает его для вызова onDispose? Почему только onDispose по-прежнему имеет это значение, а не другие побочные эффекты?
Обертка представления как var view: View? помните, что {mutableStateOf(null) заставит его работать так, как я ожидаю, но мне просто интересно, почему значение сохраняется для вызова onDispose.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ck-compose
Ответить

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

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

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

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

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