Таймер и свежий callback
Исправить захват старой функции без сброса задержки
Composable запускает секундный таймер для messageId. При смене messageId старый таймер отменяется, новый начинает отсчёт. Замена onElapsed при том же ID не должна перезапускать таймер, но по завершении нужно вызвать свежую функцию.
Зависимости: Compose Runtime и kotlinx.coroutines. Уход из композиции отменяет таймер.
Проверки: рекомпозиция с прежним ID; замена callback через 500 мс; новый ID через 500 мс; уход из композиции до секунды. Переход к другому ID и обратно считается новым таймером.
Основа: rememberUpdatedState из draft/compose_base.md.
Сохранённый код превышает предел редактора. Скачай его перед сбросом; исходная запись сохранена.
Ключ определяет срок жизни таймера; rememberUpdatedState обновляет используемый callback без смены этого срока. Если добавить callback в ключи, его замена перезапустит delay. Если сохранить callback обычным remember, можно вызвать устаревшую функцию. Эффекты Compose.
Вызов после возврата в композицию не считается дубликатом с точки зрения этого UI-договора. Для бизнес-гарантии единственной обработки потребуется владелец и идентификатор операции вне таймера. Compose-пример не запускался в Android runtime.