【发布时间】:2021-06-10 16:36:27
【问题描述】:
我想为我的(expo 增强版)react-native 应用程序引入一个简单的可配置主题,最初的重点是背景颜色。我在实现动态方面取得了一些成功,例如用户可以在应用程序中选择主题/背景颜色,该颜色会影响所有屏幕。我使用了一种相当典型的技术,其中 App.js 将其 (V5) NavigationContainer 及其主题包装在 Context 提供程序中,例如
return (
<SomeProvider>
<NavigationContainer theme={AppDefaultTheme} ref={navigationRef}>
... stuff including navigators
<NavigationContainer>
</SomeProvider>
)
在组件方面,我们可以使用 useTheme 挂钩检索主题(最初是默认主题),然后更改背景或其他任何内容,并(暂时)将变异的主题持久保存在 Provider 的 reducer 中。 reducer 还可以将变异的主题持久化到 AsyncStorage 之类的东西中,以便下次应用程序启动。
问题出在应用重启。
似乎没有办法及时从 App.js 中的冷存储(AsyncStorage 或其他)中检索当前主题以将其提供给 NavigationContainer
(记住这一点)
<NavigationContainer theme={AppDefaultTheme} ref={navigationRef}>
许多帖子指出在 RN/expo 中 没有 beforeRender 钩子或功能。当我们在 useEffect 挂钩中拉回 AppDefaultTheme 时,App.js NavigationContainer 早已离开了站点。
我猜想检索初始状态是不可能的,除非可能使用像 Redux 这样的外部状态管理器。 Redux 人是怎么解决这个问题的?我对“nonReduxLight”非常满意,例如redux 模式使用上述 Provider 包装器,颜色主题功能还不足以让我潜入那个深游泳池,但它已经接近了。
Redux 会做我想做的事吗?有没有更简单的方法?
【问题讨论】:
标签: react-native redux expo asyncstorage use-context