Без Theming Engine каждое изменение дизайна white-label приложения требует пересборки и релиза. Один из наших клиентов тратил 72 человеко-часа в месяц на обновление темы для 15 брендов. После внедрения Theming Engine эта задача сократилась до одного часа: достаточно загрузить новый JSON-конфиг на сервер. Итог: экономия 98% времени и полная гибкость. У нас 6+ лет опыта в white-label разработке, реализовано более 30 проектов с динамической тематизацией. Если вам нужно гибко управлять внешним видом десятков брендов, свяжитесь с нами — мы предложим решение.
Как Theming Engine улучшает white-label приложения?
Theming Engine — это система управления визуальными параметрами приложения через дизайн-токены. Все цвета, шрифты, размеры, радиусы углов и тени выносятся в JSON-конфиг, который загружается при старте или подменяется в runtime. Это позволяет реализовать runtime смену темы без пересборки, поддерживать сотни брендов в одном билде и адаптировать интерфейс под пользовательские предпочтения. Единая конфигурация внешнего вида для всех брендов упрощает поддержку.
Структура конфига (пример для tenant "Brand B")
{ "tenant": "brand_b", "version": "2", "colors": { "primary": "#1A73E8", "primary_variant": "#1557B0", "secondary": "#FB8C00", "background": "#FFFFFF", "surface": "#F5F5F5", "error": "#B00020", "on_primary": "#FFFFFF", "on_secondary": "#000000" }, "typography": { "font_family": "Inter", "scale_factor": 1.0 }, "shape": { "card_corner_radius": 12, "button_corner_radius": 8, "input_corner_radius": 4 }, "assets": { "logo_url": "https://cdn.brand-b.com/logo.png", "splash_bg_color": "#1A73E8" } } Сравнение статического и динамического подходов
| Критерий | Статическая тема (xcconfig/flavors) | Динамическая тема (Theming Engine) |
|---|---|---|
| Смена темы без релиза | Нет | Да |
| Количество tenants | До 10 | Любое |
| Поддержка runtime-смены | Нет | Да |
| Сложность реализации | Низкая | Средняя |
| Гибкость дизайна | Ограничена | Высокая |
Время внедрения по платформам (примерное)
| Платформа | Новый проект | Рефакторинг существующего |
|---|---|---|
| iOS (SwiftUI) | 2 недели | 3–5 недель |
| Android (Compose) | 2 недели | 3–5 недель |
| Flutter | 3 недели | 4–6 недель |
| React Native | 3 недели | 4–6 недель |
Как реализовать динамическую тему на Jetpack Compose?
Jetpack Compose делает динамическую тему значительно проще, чем XML: MaterialTheme принимает ColorScheme и Typography как параметры и применяет их ко всему дереву компонентов.
// Загрузка и парсинг темы в Compose @Composable fun TenantThemedApp(theme: TenantTheme, content: @Composable () -> Unit) { val colorScheme = lightColorScheme( primary = Color(android.graphics.Color.parseColor(theme.colors.primary)), primaryContainer = Color(android.graphics.Color.parseColor(theme.colors.primaryVariant)), secondary = Color(android.graphics.Color.parseColor(theme.colors.secondary)), background = Color(android.graphics.Color.parseColor(theme.colors.background)), surface = Color(android.graphics.Color.parseColor(theme.colors.surface)), error = Color(android.graphics.Color.parseColor(theme.colors.error)) ) val shapes = Shapes( small = RoundedCornerShape(theme.shapes.inputCornerRadius.dp), medium = RoundedCornerShape(theme.shapes.cardCornerRadius.dp), large = RoundedCornerShape(theme.shapes.buttonCornerRadius.dp) ) MaterialTheme(colorScheme = colorScheme, shapes = shapes, content = content) } // Использование в Activity setContent { val theme by themeViewModel.tenantTheme.collectAsState() TenantThemedApp(theme = theme) { AppNavHost() } } При изменении tenantTheme в ViewModel весь UI перерисовывается автоматически. Загрузка шрифтов в runtime выполняется через Downloadable Fonts API, шрифты кешируются после первой загрузки, что исключает задержки при старте. На практике смена темы занимает менее 2 секунд, тогда как статический релиз — 24 часа.
Flutter и React Native
Flutter: ThemeData в MaterialApp параметризируется аналогично Compose. Для полного контроля используйте InheritedWidget или Riverpod-провайдер с объектом темы. Загрузка шрифтов в runtime через FontLoader API.
React Native: ThemeContext через React Context API, StyleSheet.create вызывается с токенами из контекста. Горячая перезагрузка темы без рестарта — через useContext(ThemeContext) в компонентах.
Почему важен паттерн stale-while-revalidate для загрузки тем?
Stale-while-revalidate (описан в документации MDN) — это стратегия кеширования, которая гарантирует актуальность данных без задержек. Показываем кешированную тему сразу, обновляем в фоне. Это исключает ожидание при старте и предотвращает сломанный UI при ошибках сети.
class ThemeStore: ObservableObject { @Published var currentTheme: TenantTheme = .default func loadTheme(tenantId: String) async { do { if let cached = ThemeCache.load(tenantId: tenantId) { await MainActor.run { currentTheme = cached } } let dto = try await api.fetchTheme(tenantId: tenantId) let theme = TenantTheme(from: dto) ThemeCache.save(theme, tenantId: tenantId) await MainActor.run { currentTheme = theme } } catch { // Fallback на дефолтную тему, не крэшимся } } } Стандартная загрузка без паттерна приводила бы к пустому экрану на 200-300 мс. Сравните: статическая тема требует 24 часа релиза, динамическая переключается за 2 секунды — разница в 43 200 раз.
Как версионирование тем предотвращает сломанный UI?
При обновлении контракта (добавлении нового токена) старые кешированные темы могут не содержать этого поля. Если версия темы ниже минимально поддерживаемой — используем бандлированную дефолтную тему. Это защищает от отображения битого UI.
Процесс работы
- Аудит UI: инвентаризация всех цветов, шрифтов, радиусов в приложении, выявление хардкода.
- Проектирование схемы токенов совместно с дизайнером: какие параметры меняются между брендами.
- Реализация ThemeProvider, Environment-based применения, загрузки из API.
- Рефакторинг компонентов: замена хардкода на токены, покрытие визуальными тестами (Paparazzi для Android, SwiftUI Previews для iOS).
- Тестирование смены темы в runtime: все компоненты перерисовываются корректно, шрифты загружаются без мерцания.
Ориентиры по срокам
Theming Engine для нового приложения с нуля (Compose или SwiftUI) — 2–3 недели. Рефакторинг существующего приложения с хардкодированными цветами под динамическую тему — зависит от объёма кодовой базы, обычно 3–6 недель. Стоимость рассчитывается индивидуально.
Чек-лист внедрения Theming Engine
- Аудит UI: инвентаризация всех цветов, шрифтов, радиусов
- Проектирование схемы токенов с дизайнером
- Реализация ThemeProvider и загрузчика тем
- Рефакторинг компонентов: замена хардкода на токены
- Настройка кеширования и обработка ошибок
- Тестирование смены темы: все компоненты перерисовываются корректно
- Документация по добавлению новых tenants
Готовы внедрить Theming Engine в ваше white-label приложение? Получите консультацию эксперта — мы проанализируем ваш UI и предложим оптимальное решение.







