Событие и состояние отвечают на разные вопросы
Нажатие кнопки — событие: оно сообщает, что произошло. Текущее число на счётчике — состояние: оно описывает, что интерфейс должен показывать сейчас. Если эти понятия смешать, легко получить экран, который умеет регистрировать нажатия, но не отражает результат. В учебном примере начальное число равно нулю. Событие увеличить изменяет его на единицу, а надпись отображает новое значение. Здесь можно отдельно проверить обработку события и соответствие надписи данным, вместо поиска ошибки сразу во всех частях приложения.
Экран отображает данные
В декларативном интерфейсе описывают, как должен выглядеть экран при определённом состоянии. Когда наблюдаемое состояние меняется, связанные элементы могут быть пересчитаны. Это не означает, что каждое нажатие обязано вручную перекрашивать весь экран. Для примера со списком состояние может содержать сами элементы, признак загрузки и сообщение об ошибке. Если записать только список, будет трудно отличить отсутствие данных от процесса их получения. Чёткое описание состояний делает такие различия явными ещё до написания сетевого кода.
Определите владельца значения
Если число независимо хранится и в кнопке, и в надписи, две копии могут разойтись. Удобнее определить один источник значения и передавать нужным частям интерфейса данные и возможность сообщить о действии. В Compose перенос состояния к общему владельцу называют подъёмом состояния. Это помогает разделять отображение и управление. Но не всякое значение нужно сразу помещать в самый верх приложения. Место выбирают по тому, кто должен читать и изменять данные, а также по требуемому времени их жизни.
Запомнить в памяти не значит сохранить навсегда
Механизм remember в Compose удерживает значение при повторном выполнении соответствующей части композиции, но сам по себе не является постоянным хранилищем. Для восстановления небольшого состояния интерфейса существуют другие механизмы, а долговременные данные требуют отдельного решения. Важно заранее спросить, что должно случиться после поворота устройства, пересоздания экрана или нового запуска. Учебный счётчик и пользовательские заметки могут требовать разных ответов. Автоматически считать любое видимое число надёжно сохранённым — распространённая логическая ошибка.
Попробуйте на практике
Смоделируйте экран счётчика на бумаге без компьютера.
- Нарисуйте надпись с числом и две кнопки: увеличить и сбросить. Отдельно запишите единственную переменную состояния со значением ноль.
- Выполните последовательность событий: увеличить, увеличить, сбросить, увеличить. После каждого запишите новое состояние и ожидаемую надпись.
- Добавьте условие повторного отображения экрана без нового события. Проверьте, что само рисование не увеличивает число.
- Запишите отдельное требование к новому запуску: начинать с нуля или восстанавливать прежнее значение. Объясните, почему это решение о хранении, а не о внешнем виде кнопки.
Как проверить результат. Получатся значения 1, 2, 0 и 1. У модели один источник состояния, отображение не изменяет его самопроизвольно, а правило восстановления указано отдельно.
Частые вопросы
Нужно ли сначала изучить все библиотеки Android?
Для понимания этой модели нет. Сначала полезно различать данные, события и отображение; конкретные инструменты реализуют эти отношения.
Состояние — это только число или текст?
Нет. Оно может описывать список, выбор, загрузку, ошибку и другие данные, необходимые для отображения конкретного экрана.
Почему две одинаковые переменные могут быть проблемой?
Если обе претендуют на роль текущего значения, изменения могут попасть только в одну. Явное владение данными уменьшает такую неопределённость.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.