Когда отменяется LaunchedEffect(userId)?При изменении userId или уходе соответствующего места из композиции. При новом входе работа запускается заново. Эффекты Compose.
Где зарегистрировать слушателя с обязательным удалением?В DisposableEffect с ключом владельца ресурса и парным удалением в onDispose. Для корутинной работы используйте подходящий coroutine scope. Эффекты Compose.
Callback изменился, а таймер перезапускать нельзя. Что использовать?rememberUpdatedState для callback и LaunchedEffect с ключом, который действительно определяет таймер. Корутинный блок прочитает актуальное значение при вызове. Эффекты Compose.
Почему SideEffect точнее вызова из тела composable для синхронизации внешнего объекта?Он выполняется после успешного применения композиции. Тело composable может выполняться повторно и не завершиться применением. Эффекты Compose.
LaunchedEffect(Unit) гарантирует единственную отправку аналитики навсегда?Нет. Он привязан к конкретному входу в композицию. После ухода и возвращения эффект снова запускается; дедупликация бизнес-события требует отдельной политики. Эффекты Compose.
Зачем избегать LaunchedEffect(query) вокруг snapshotFlow { query }?query уже наблюдается потоком; ключ одновременно отменяет и пересоздаёт коллектор при каждом изменении. Выберите срок жизни наблюдения отдельно от наблюдаемого значения. Эффекты Compose.