К настоящему времени я уверен, что вы заметили последнюю тенденцию, которая штурмом захватила мир приложений: многие из компаний, которые мы знаем и любим, включая Slack, Instagram, Medium и многие другие, теперь предлагают пользователям возможность переключаться к темной цветовой теме. И Apple, и Google добавили ту же функцию в свои операционные системы.
Итак, если вы когда-нибудь хотели реализовать цветовые режимы в своем приложении React Native, это руководство покажет вам один способ достижения этой цели.
Подготовка к настройке
Первое, что нам нужно сделать, это настроить нашу тему. В нашем объекте темы мы вложим объект режимов внутрь объекта цветов. Здесь важно отметить, что объект dark
имеет ту же форму, что и цвета, определенные над ним.
Нам также нужно будет экспортировать наш режим (ы) как массив строк, чтобы мы могли их перебирать. Вы можете заметить, что у нас также нет light
режима; это потому, что мы автоматически назначаем цвета верхнего уровня default
режиму. Поскольку у нас нет объекта режима по умолчанию для прямой ссылки, нам нужно вручную добавить его в начале, используя unshift
. Теперь ваш объект темы должен выглядеть примерно так:
Настройка контекста
Затем, если вы еще этого не сделали, вам нужно поместить свое приложение в ThemeProvider
из styled-components
.
Теперь, когда наше приложение может получить доступ к нашей теме, нам нужно настроить нашего собственного поставщика контекста для обработки логики переключения между темами и запоминания предпочтений пользователя:
Здесь не происходит ничего особенного. Мы просто создаем поставщик контекста, который принимает два реквизита: mode
и toggleMode
. Затем мы присваиваем mode
значение по умолчанию.
Мы также экспортируем настраиваемую ловушку под названием useAppContext
, которая предназначена исключительно для удобства, чтобы мы могли получить доступ к контексту нашего поставщика приложений без необходимости каждый раз ссылаться на React.useContext(AppContext)
.
Переключение режимов
Как мы видим выше, наш компонент AppProvider принимает два реквизита, mode
и toggleMode
- мы определим их ниже в нашем файле App.tsx.
Итак, теперь мы можем циклически перемещаться по нашему массиву режимов, который мы создали ранее, и устанавливать это значение в состояние.
Следующее, что нам нужно сделать, это динамически обновить наш объект темы на основе текущего активного режима. Мы можем добиться этого с помощью некоторых вспомогательных функций из Lodash:
Что замечательно в этой технике, так это то, что вместо управления двумя отдельными объектами темной / светлой темы вы можете добавить столько цветовых режимов, сколько захотите, и она просто переключает их, когда вы нажимаете toggleMode
.
Пример:
Мы почти закончили настройку логики для переключения нашей цветовой схемы. Все, что нам еще нужно сделать, это установить для пользователя предпочтение Async Storage, чтобы в следующий раз, когда пользователь откроет приложение, он запомнит предпочтительный цветовой режим:
В том же файле App.tsx, где находится наша toggleMode
функция, мы добавляем два useEffect
перехватчика.
Первый запускается при монтировании (обратите внимание на пустой массив зависимостей) и отвечает за выборку пользовательских предпочтений из AsyncStorage и установку их в состояние.
Другой - для установки нового режима AsyncStorage при каждом его обновлении. Что касается утилиты colorModeStorage
, это просто объект, содержащий некоторые функции установки / получения:
Теперь, когда мы все настроены, последнее, что нам нужно сделать, это добавить кнопку / переключатель в наше приложение, которое мы будем использовать для циклического переключения режимов. Однако как вы это сделаете, зависит от вас и выходит за рамки данного руководства.
Чтобы убедиться, что все ваши компоненты хорошо реагируют при переключении цветовых режимов, обязательно всегда используйте цвета из вашей темы. И поскольку мы используем систему стилей, вы должны ссылаться на цвета из своей темы следующим образом:
<Box bg="primary" />
Вот и все. Вы можете увидеть полный файл App.tsx ниже:
Кстати, если вы используете react-navigation
в своем приложении (что, я уверен, большинство из вас использует), вы могли заметить, что по умолчанию любые используемые вами компоненты, такие как Tabs
и т. Д., Автоматически не работают. переключать цветовые режимы.
К счастью, react-navigation
поддерживает тематику - вам просто нужно указать своему навигатору, какую тему использовать. Сделать это можно так:
И все готово.
Ресурсы
Большое спасибо Бренту Джексону, который создал styled-system за его руководство по цветовым режимам.
Эта статья была адаптацией его руководства для использования в приложениях React Native.