在React Native上为“ HackerJobs”实现黑暗模式

我感到很累,但决心完成这个正确的应用程序。 我还想了解其他事情。 与往常一样,可以在这里找到该应用的仓库。

今天的主要重点是完成大部分“黑暗模式”,这是我多年来一直希望在我的应用程序上要做的事情。 有很多要介绍的内容,所以让我们开始吧。

表明我们处于黑暗模式

以前,我必须在应用程序中创建某种“设置”功能。 今天,这是由Redux处理的,在InitialState的Settings部分中带有嵌套的true / false布尔值。

const initialState = { 
selectedTab: "Jobs",
savedJobs: [],
settings: {
"Dark Mode": true,
"Shuffle Job Threads When Opening": true
}
}

事实证明,这非常有用,因为我现在可以访问应用程序的大部分内容,我们需要使用一个简单的MapStateToProps调用来指示其视图状态。

 mapStateToProps = (state) => { 
return {
savedJobs: state.get('savedJobs'),
darkMode: state.get('settings')['Dark Mode']
}
}

这只是我痛苦的开始。

背景资料

由于每个应用程序选项卡组件屏幕都是独立创建的,因此需要进行一些工作以统一样式。 我创建了DarkStyles JS文件,该文件导出了深色视图所需的各种样式。

 export const darkstyle = StyleSheet.create({ 
listDark: {
backgroundColor: 'black'
},
buttonDark: {
backgroundColor: "black",
borderColor: 'white'
},
cellCopyDark: {
color: 'white'
}
})

事实证明,这比我想象的要容易。 这只是意味着编写许多三元声明,以将各种样式混合在一起。 这是简单文本视图中的一个示例,该示例告诉用户没有保存的作业。

 <View style={[styles.emptyTextContainer, 
(this.props.darkMode ? darkstyle.listDark : null)]}>
<Text style={[styles.emptyText,
(this.props.darkMode ? darkstyle.cellCopyDark : null)
]}>
You do not have any stories saved.

注意,这必须同时在背景和文本上进行。

纽扣

具有讽刺意味的是,您不应该将Component用作要样式的任何东西。 如果您不想要简单的按钮组件,则可以使用TouchableHighlight和View / Text滚动自己的组件。 真烦人

不过,将其设置为黑暗模式很好。

标签栏IOS

这需要一些谷歌搜索。 尽管React Native文档建议您在对象内使用BarStyle函数,但我发现它实际上并没有做任何事情。 最后,我需要使用BarTintColor并使用三元语句。

 <TabBarIOS 
barTintColor={this.props.darkMode ? 'black' : null}
translucent={true}>

我认为调用半透明为true或false都不会对应用程序产生任何影响。 但是谁知道。

状态栏

唯一的挑战是它需要作为渲染中TabBarIOS封闭函数的一个同级对象,而当时我只是坐在那里。 将其作为同胞坐着导致React Native向我抛出一个大的旧错误。

  

我决定通过将家人包裹在下面将要解决的SafeArea视图中来解决此问题。

关于StatusBar,我要说的唯一奇怪的事情是“ Light-content”不涉及Light模式。 这仅表示该栏的内容是黑色背景上的白色文本(我的应用程序的“暗模式”)。 当您为“暗模式”编写应用程序时,将其设置为“暗内容”,然后变成黑白色,这有点令人困惑。 啊啊

对于iPhone X

我碰到了这篇文章,讨论了如何针对X修改应用程序。我还必须将Yarn将React Native升级到0.50.1。 一切都没有中断,所以我同意了。 大概不应该这样做。

 <SafeAreaView style={( 
this.props.darkMode ? styles.safeareaBlack: styles.safearea
)}>

老实说,在输入SafeArea之前,我比较喜欢外观。 但是无所谓。

下一步是什么

标题栏看起来仍然很奇怪,但我不确定如何解决。 我还在考虑。

总的来说,我认为应用程序的心脏已经准备就绪。 接下来的事情是完善它,并准备好提交。