I am trying to add some dynamic styling in my React Native project. I am using a React Native Snackbar but at this moment it goes in front of my Floating Action Button. This is not by the design rules of Material design.
For that reason I need to move my FAB whenever that snackbar is active. I am keeping this in a state but I need a styling based on that state.
At this moment I got the following code:
constructor(props){
super(props);
this.state = {
snackbar: true,
}
}
../
const styles = StyleSheet.create({
container: {
marginBottom: this.state.snackbar ? 50 : 0,
backgroundColor: colors.accentColor,
height: Dimensions.get('window').width / 9,
width: Dimensions.get('window').width / 9,
},
});
The error that I get is that it object is undefined. So I am not sure why this isn't working. Maybe somebody can help me out with this problem.
At this moment I got it solved in the following way:
constructor(props){
super(props);
this.state = {
snackbar: true,
}
Snackbar.addEventListener('show',()=>{this.setState({snackbar:true})})
Snackbar.addEventListener('hidden',()=>{this.setState({snackbar:false})})
}
render() {
return <ActionButton
onPress={() => {this.props.nav.push(routes.takePicture)}}
style={this.state.snackbar ? stylesFabUp : styles}
/>;
}
}
const stylesFabUp = StyleSheet.create({
container: {
marginBottom: 40,
backgroundColor: colors.accentColor,
height: Dimensions.get('window').width / 9,
width: Dimensions.get('window').width / 9,
},
})
const styles = StyleSheet.create({
container: {
// marginBottom: this.state.snackbar ? 50 : 0,
backgroundColor: colors.accentColor,
height: Dimensions.get('window').width / 9,
width: Dimensions.get('window').width / 9,
},
});
But I don't like that solution because than I got 2 stylesheets
You do not need to have 2 stylesheets.
Consider the following code:
constructor(props){
super(props);
this.state = {
snackbar: true,
}
Snackbar.addEventListener('show', () => {this.setState({snackbar:true})})
Snackbar.addEventListener('hidden', () => {this.setState({snackbar:false})})
}
render() {
const fabPositionStyle = this.state.snackbar ? styles.pushUp : styles.normal
return <ActionButton
onPress={() => {this.props.nav.push(routes.takePicture)}}
style={[ styles.fab, fabPositionStyle ]}
/>;
}
}
const styles = StyleSheet.create({
fab: {
height: Dimensions.get('window').width / 9,
width: Dimensions.get('window').width / 9,
backgroundColor: colors.accentColor,
},
pushUp: {
marginBottom: 40,
},
normal: {
marginBottom: 0,
},
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With