Похоже, ваш пользователь еще не вошел в приложение.В этом случае firebase.auth().currentUser
- это null
, поэтому, когда вы делаете firebase.auth().currentUser.uid
, вы звоните uid
на null
.
Простой способ исправить это - всегда проверять null
после звонка firebase.auth().currentUser
.Итак:
currentUser = firebase.auth().currentUser
if (currentUser != null) {
var that = this
firebase.database().ref(user.uid).child('plantList').on('child_added',function(data){
...
Обратите внимание, что я также удалил await
до firebase.auth().currentUser
.Поскольку firebase.auth().currentUser
не является асинхронной операцией, здесь нет необходимости (и не использовать) await
.
Лучшее решение - использовать прослушиватель состояния авторизации, как также показано в этом примере из Документация RNFirebase :
componentDidMount() {
this.unsubscriber = firebase.auth().onAuthStateChanged((user) => {
this.setState({ user });
});
}
Так что в вашем случае это будет означать:
componentDidMount(){
firebase.auth().onAuthStateChanged((user) => {
if (user != null) {
var that = this
firebase.database().ref(currentUser.uid).child('plantList').on('child_added',function(data){
var newData = [...that.state.listViewData]
newData.push(data)
that.setState({ listViewData: newData})
})
}
})
}
Вход в систему или восстановление состояния аутентификации, когдаприложение перезапускается, это асинхронная операция.Поэтому простой вызов firebase.auth().currentUser
может упустить тот факт, что пользователь выполнил вход. Используя onAuthStateChanged
, Firebase будет вызывать ваш код при каждом изменении состояния аутентификации, что является идеальным моментом для выполнения действий, зависящих от состояния аутентификации, таких как (в вашем случае) прослушивание данных для этого пользователя).