Description
Hello,
I have a strange error.
My APL use react-native and Firebase.
react-native run-android works fine without error.
but react-native run-ios failed with JSON value of type NSnull cannot be converted to NSString.
source code is as follows.(main and signup class to authentication work on firebase)
I think Firebase Class has different ACT on ios and Android to convert JSON to text.
Any suggestion appreciated.
Shoji
main
// Initialize the firebase app here and pass it to other components as needed. Only initialize on startup.
const firebaseApp = firebase.initializeApp(firebaseConfig);
var GiftedMessenger = require('react-native-gifted-messenger');
let styles = {}
class Pricing extends Component {
constructor(props){
super(props);
this.state = {
page: null
};
/* this.itemsRef = this.getRef().child('items'); */
}
componentWillMount(){
// We must asynchronously get the auth state, if we use currentUser here, it'll be null
const unsubscribe = firebaseApp.auth().onAuthStateChanged((user) => {
// If the user is logged in take them to the accounts screen
if (user != null) {
this.setState({page: Account});
console.log('(user != null)')
return;
}
// otherwise have them login
console.log('(user != Login)')
this.setState({page: Login});
// unsubscribe this observer
unsubscribe();
});
}
render() {
if (this.state.page) {
return (
// Take the user to whatever page we set the state to.
// We will use a transition where the new page will slide in from the right.
<Navigator
initialRoute={{component: this.state.page}}
configureScene={() => {
return Navigator.SceneConfigs.FloatFromRight;
}}
renderScene={(route, navigator) => {
if(route.component){
// Pass the navigator the the page so it can navigate as well.
// Pass firebaseApp so it can make calls to firebase.
return React.createElement(route.component, { navigator, firebaseApp});
}
}} />
);
} else {
return (
// Our default loading view while waiting to hear back from firebase
);
}
}
}
styles = StyleSheet.create({
container: {
margin: 15
},
headingContainer: {
marginTop: 60,
justifyContent: 'center',
alignItems: 'center',
padding: 40,
backgroundColor: colors.grey2
},
heading: {
color: 'white',
marginTop: 10,
fontSize: 22
}
})
export default Pricing
Signup CLASS
export default class Signup extends Component {
constructor(props) {
super(props);
this.state = {
// used to display a progress indicator if waiting for a network response.
loading: false,
// entered credentials
email: '',
password: ''
}
}
// A method to passs the username and password to firebase and make a new user account
signup() {
this.setState({
// When waiting for the firebase server show the loading indicator.
loading: true
});
// Make a call to firebase to create a new user.
this.props.firebaseApp.auth().createUserWithEmailAndPassword(
this.state.email,
this.state.password).then(() => {
// then and catch are methods that we call on the Promise returned from
// createUserWithEmailAndPassword
alert('Your account was created!');
this.setState({
// Clear out the fields when the user logs in and hide the progress indicator.
email: '',
password: '',
loading: false
});
this.props.navigator.push({
component: Login
});
}).catch((error) => {
// Leave the fields filled when an error occurs and hide the progress indicator.
this.setState({
loading: false
});
alert("Account creation failed: " + error.message );
});
}
render() {
// The content of the screen should be inputs for a username, password and submit button.
// If we are loading then we display an ActivityIndicator.
const content = this.state.loading ? :
<TextInput
style={styles.textInput}
onChangeText={(text) => this.setState({email: text})}
value={this.state.email}
placeholder={"Email Address"} />
<TextInput
style={styles.textInput}
onChangeText={(text) => this.setState({password: text})}
value={this.state.password}
secureTextEntry={true}
placeholder={"Password"} />
登録
ログインに移行
;
// A simple UI with a toolbar, and content below it.
return (
<View style={styles.container}>
<GiftedMessenger
style={styles.toolbar}
title="Signup" />
<View style={styles.body}>
{content}
</View>
</View>
)
}
// Go to the login page
goToLogin(){
this.props.navigator.push({
component: Login
});
}
}
AppRegistry.registerComponent('Signup', () => Signup);
Activity
itagakixt commentedon Nov 26, 2016
Hello,
I deeply debuged in this BUG. At last I found it as follows.
<Image
source={{uri: 'this.state.user.photoURL'}} <<
I did not expect like this kind of error.
Thanks Shoji
itagakixt commentedon Nov 26, 2016
Why ios and Android do different action without single quotation?
with single quotation both do same action. Why?
Larney11 commentedon Apr 14, 2017
@itagakixt I have the same issue. Could you tell me how you solved the issue? Thanks
digitaldavenyc commentedon May 12, 2017
@itagakixt +1 to @Larney11 I would like to know "how" you debugged this. This error is extremely ominous....
nico1510 commentedon May 20, 2017
@digitaldavenyc if you are displaying an image like this
then you have to make sure that
user.photoURL
can't be null otherwise this error will show on iOS. At least that was what caused it for me.