Реактивная база данных Firebase.Ref.on срабатывает только один раз - PullRequest
0 голосов
/ 17 сентября 2018

Я занимаюсь разработкой на Android , подключенном устройстве (не эмулятор), с Live Reload включено . Каждый раз, когда я сохраняю файл, он перезагружает мое приложение на устройстве, чего я и хочу.

В настоящее время я использую Firebase для аутентификации и базы данных в реальном времени. Чтобы получить данные зарегистрированных пользователей, у меня есть действие Redux , которое вызывает firebase.database() следующим образом:

// AppRedux.js
const reducer = (state = initialState, action) => {
    switch (action.type) {
        case 'setCurrentUser':
            return { ...state, currentUser: action.value }
            break;
        // { ... }
    }
}

const store = createStore(reducer, applyMiddleware(thunkMiddleware))
export { store }

const setCurrentUser = (user) => {
    return {
        type: "setCurrentUser",
        value: user
    }
}

const watchUserData = () => {
    return function(dispatch) {
        const { currentUser } = firebase.auth()

        if (currentUser) {
            console.log(currentUser.uid) // I always have the right uid, so firebase.auth() always works
            const ref = firebase.database().ref('users/' + currentUser.uid)

            ref.on('value', (snapshot) => {
                const user = snapshot.val()
                console.log(user) // I get there onlye once !

                dispatch(setCurrentUser(user))
            }, (error) => {
                console.log(error)
            })
        }
    }
}
export { setCurrentUser, watchUserData }

А вот где я называю это действие:

// Main.js

// { ... other imports}
import { watchUserData } from '../redux/AppRedux'


const mapStateToProps = (state) => {
    return {
        currentUser: state.currentUser
    }
}
const mapDispatchToProps = (dispatch) => {
    return {
        watchUserData: () => dispatch(watchUserData())
    }
}

class Main extends React.Component {
    constructor(props) {
        super(props)
    }

    componentWillMount() {
        this.props.watchUserData()
    }

    render() {
        const { currentUser } = this.props

        return (
            <View>
                <Text>Hello { currentUser && currentUser.firstname }!</Text>
            </View>
        )
    }
}
export default connect(mapStateToProps, mapDispatchToProps)(Main)

Этот фрагмент кода работает отлично - , но только один раз . Когда запускается Live Reload, он больше не работает.

Обратите внимание, что firebase.auth() все еще работает и дает мне право uid, но firebase.database().ref('users/' + currentUser.uid).on('value') больше не будет срабатывать

Мне нужно npm run android (что равно react-native run-android), чтобы он снова выстрелил .. до следующей Live Reload .

Обратите внимание, что это не сработает, даже если я выйду из системы и снова войду в систему. Я все еще должен npm run android, чтобы он работал.

Вот мой package.json на случай, если это будет иметь значение

"dependencies": {
    "react": "^16.3.2",
    "react-native": "^0.55.3",
    "react-native-firebase": "^4.3.6",
    "react-native-google-signin": "^1.0.0-rc5",
    "react-navigation": "^2.14.2",
    "react-redux": "^5.0.7",
    "redux": "^4.0.0",
    "redux-thunk": "^2.3.0"
}

Что-то я не так делаю? Это потому, что у меня есть бесплатный план Firebase, и я делаю слишком много звонков или что-то в этом роде?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Для любого, кто приземлится здесь в результате поиска, похоже, это ошибка в response-native-firebase

0 голосов
/ 05 ноября 2018

Я думаю, что это связано с несколькими отправками, попробуйте:

dispatch(setCurrentUser(user), { allowMore: true })

Вы можете узнать больше на здесь

...