Как обновлять значения в UI с учетом разных способов начисления и анимаций
Что проверяют
Умеете ли вы развести данные и их отображение: баланс уже начислен, а цифра на экране ещё «добегает». Следом спросят, что будет, если новое начисление придёт посреди анимации.
Как отвечать
Ключевая идея: два значения. ActualValue это правда из модели, она меняется мгновенно. DisplayedValue показывает UI, и анимируется только оно. Тогда логика не ждёт анимацию, а анимация не врёт про баланс.
- уведомление: ViewModel реализует
INotifyPropertyChanged, удобно черезCommunityToolkit.Mvvmи[ObservableProperty]. View привязан кDisplayedValue; - способы начисления как стратегии: мгновенное (просто присвоить), набегающее (плавный переход за доли секунды), пакетное (несколько начислений подряд склеиваются в одно). Выбор зависит от типа события и не размазан по
ifво View; - перенаправление анимации: если во время анимации пришло новое начисление, она продолжается от текущего
DisplayedValueк новой цели, а не стартует заново. Иначе цифра прыгает назад; - механика: в WPF
DoubleAnimationработает только по dependency property, поэтому число анимируют через собственное свойство или покадрово вCompositionTarget.Rendering, интерполируя по прошедшему времени. В Unity то же делают корутиной или вUpdateчерезMathf.MoveTowardsиTime.deltaTime; - потоки: начисление часто приходит из сети. Изменения из фона переносятся в UI-поток через
DispatcherилиSynchronizationContext, а в Unity API движка из фонового потока трогать нельзя вовсе; - форматирование: промежуточные значения округляйте и форматируйте с нужной
CultureInfo, иначе на экране мелькнёт1234,5678.
Где спотыкаются
Анимируют само значение модели. Пока цифра бежит, другой код читает промежуточный баланс, и ошибки появляются в расчётах и сохранениях.
Анимируют не то свойство. Классика: DoubleAnimation навешивают на Opacity и удивляются, что текст мигает, а цифра стоит на месте.
Используют таймер с фиксированным шагом без учёта прошедшего времени. На медленном устройстве анимация растягивается, а при частых начислениях очередь анимаций отстаёт от реального баланса.