Я хотел бы представить простую настраиваемую тему для моего (расширенного) приложения, ориентированного на реакцию, с первоначальным акцентом на цвет фона. У меня был некоторый успех в реализации динамических аспектов, например. пользователь может выбрать цвет темы/фона в приложении, и этот цвет влияет на все экраны. Я использовал довольно типичную технику, когда App.js оборачивает свой (V5) NavigationContainer и его тему в поставщика контекста, например.
return (
<SomeProvider>
<NavigationContainer theme={AppDefaultTheme} ref={navigationRef}>
... stuff including navigators
<NavigationContainer>
</SomeProvider>
)
На стороне компонента мы можем получить тему (изначально используемую по умолчанию) с помощью хука useTheme, затем изменить фон или что-то еще и (временно) сохранить измененную тему для состояния в редьюсере провайдера. Редюсер также может сохранить мутированную тему во что-то вроде AsyncStorage для следующего запуска приложения.
Проблема возникает из-за перезапуска приложения.
Кажется, что нет способа получить текущую тему из холодного хранилища (AsyncStorage или другого) в App.js вовремя, чтобы передать ее в NavigationContainer.
(запомните это) <NavigationContainer theme={AppDefaultTheme} ref={navigationRef}>
Многочисленные сообщения указывают на то, что в RN/expo нет хука или возможности перед Render. И к тому времени, когда мы возвращаем AppDefaultTheme в хук useEffect, контейнер навигации App.js уже давно покинул станцию.
Я предполагаю, что получение начального состояния просто невозможно, если, возможно, не используется внешний менеджер состояний, такой как Redux. Является ли Redux тем, как люди решили эту проблему? Я был очень доволен nonReduxLight, например. шаблоны сокращения с использованием оболочек Provider в соответствии с вышеизложенным, и функции цветовой темы недостаточно, чтобы заставить меня погрузиться в этот глубокий бассейн, но это приближается.
Будет ли Redux делать то, что я хочу? Есть ли более простой способ?