Firebaseを使用したアプリで電話番号を使用してログインしようとしていますが、ログインプロセスで問題が発生しています。 Firebaseで電話番号を使用してログインできませんが、電話番号を登録してホームページにリダイレクトすると、正しく機能します。ログインに同じ方法を使用していますが、TypeError: Cannot read property 'uid' of null
のような問題が発生しましたが、すべてのコンソール値を取得できました。ここで何が問題なのかわかりません。しかし、そのエラーは3回繰り返し表示されています。
これが私のコードです:
renderLoginButton() {
if (this.props.loading) {
return (
<Spinner size="large" />
);
}
return (
<Button
style={{ alignSelf: 'flex-start' }}
onPress={this.onLoginBtnClicked.bind(this)}
>
Login
</Button>
);
}
onLoginBtnClicked(){
const { contact, password } = this.props;
const error = Validator('password', password) || Validator('contact', contact);
if (error !== null) {
Alert.alert(error);
} else {
console.log('else');
// this.props.loginUser({ contact, password});
const mobileNo = '+91'+contact;
firebase.auth().signInWithPhoneNumber(mobileNo)
.then(confirmResult =>
console.log(confirmResult),
curr = firebase.auth(),
console.log("curr"+JSON.stringify(curr)),
this.setState({ data: curr}),
NavigationService.navigate('Home')
)
.catch(error => console(error.message) );
}
}
CustomDrawerComponent.js
import React, { Component } from 'react';
import { View, Image, Text } from 'react-native';
import { DrawerItems } from 'react-navigation';
import { connect } from 'react-redux';
import { fetchUserDetails } from '../actions';
class CustomDrawerContentComponent extends Component {
state = {
uri: '',
isfailed: ''
}
componentWillMount() {
this.props.fetchUserDetails();
}
componentWillReceiveProps(nextProps) {
let uri = '';
if (nextProps.ProfilePic !== '') {
uri = nextProps.ProfilePic;
this.setState({ uri, isfailed: false });
} else {
uri = '../images/ic_person_24px.png';
this.setState({ uri, isfailed: true });
}
this.setState({ uri });
}
renderProfileImage() {
if (!this.state.isfailed) {
return (
<Image
style={styles.profileImageStyle}
source={{ uri: (this.state.uri) }}
/>
);
}
return (
<Image
style={styles.profileImageStyle}
source={require('../images/ic_person_24px.png')}
/>
);
}
render() {
console.log('Profile Pic :: ', this.props.ProfilePic);
return (
<View style={styles.container}>
{this.renderProfileImage()}
<Text style={styles.textStyle}>
{this.props.name} - {this.props.category}
</Text>
<DrawerItems {...this.props} />
</View>
);
}
}
const styles = {
container: {
flex: 1,
paddingLeft: 10
},
textStyle: {
fontSize: 14,
textAlign: 'left',
color: '#000000'
},
profileImageStyle: {
alignSelf: 'flex-start',
marginTop: 16,
padding: 10,
width: 40,
height: 40,
borderRadius: 75
}
};
const mapStateToProps = state => {
const { userprofile } = state;
return userprofile;
};
export default connect(mapStateToProps, { fetchUserDetails })(CustomDrawerContentComponent);
callStack:
user
がundefined
(またはnull
)として返されるのはなぜですか?
ログインしたユーザーがあることを知っています。ログインしたばかりです、そうです、chrome dev toolsでユーザーオブジェクトを表示することもできます。
では、なぜまだ未定義を返すのですか?それには正解があります。
ユーザーオブジェクトを取得しています[〜#〜] before [〜#〜]そのオブジェクトを使用する準備ができています。
現在、これはいくつかの異なる理由で発生する可能性がありますが、この2つの「ルール」に従えば、そのエラーは再び表示されません。
ルール#1:constructor()
の外に移動します
次のようなものがあれば:
constructor(){
this.userId = firebase.auth().currentUser.uid
}
ページが読み込まれる時間の半分を超えると、ユーザーの準備が整う前にコンストラクターがユーザーを取得しようとします。ページが完全に読み込まれていないためアプリがページをブロックしているため、uidにアクセスしようとしていますまだ存在しないプロパティの。
ページが完全に読み込まれたら、を呼び出してcurrentUser.uid
ルール#2:観察可能にする
実行できる別の方法があります。先ほど行った前のFirebase呼び出しです。firebase.auth()。currentUserは同期です。代わりにauthオブザーバブルをサブスクライブすることで非同期にすることができます。
/**
* When the App component mounts, we listen for any authentication
* state changes in Firebase.
* Once subscribed, the 'user' parameter will either be null
* (logged out) or an Object (logged in)
*/
componentDidMount() {
this.authSubscription = firebase.auth().onAuthStateChanged((user) => {
this.setState({
loading: false,
user,
});
});
}
/**
* Don't forget to stop listening for authentication state changes
* when the component unmounts.
*/
componentWillUnmount() {
this.authSubscription();
}
render() {
// The application is initialising
if (this.state.loading) return null;
// The user is an Object, so they're logged in
if (this.state.user) return <LoggedIn />;
// The user is null, so they're logged out
return <LoggedOut />;
}
}
ソース記事: Firebaseがundefined
をフェッチするとuid
を返す理由
Reactネイティブの優れたチュートリアルがここにあります: Firebase AuthenticationのはじめにReactネイティブ 以降、コードは表示されませんでしたより多くのコードを表示するように質問を更新していただければ幸いです。