Firestore onSnapshot продолжает дублировать записи в Flatlist - PullRequest
0 голосов
/ 02 марта 2020

Я работаю с Firebase Firestore для хранения и извлечения данных в режиме реального времени.

Я рендеринг данных, полученных в FlatList, и я просмотрел документацию, и я предполагаю, что я выполнил каждый шаг, который был объяснен в документе, и я полностью понимаю, что объясняется в документации. Однако, когда поле добавляется в документ, массив в FlatList дублируется, иногда x8. Я работаю с redux.

Я испробовал каждое возможное решение в Интернете, но я не могу найти идеальное решение этой проблемы, с которой я сталкиваюсь. Я тоже не знаю точно ли я отписался. Было бы очень признательно, если бы я мог получить некоторую помощь здесь. Ниже приведен мой пример кода, и я очистил его для ясности.

constructor(props) {
    super(props);
    this.state = {
        isLoading: false,
    };
    this.unsubscribe = null;
}

componentDidMount() {
    this.unsubscribe = this.getRealTimeData();
}

componentWillUnmount() {
    this.unsubscribe();
}

getRealTimeData = () => {
    const myData = [];
    this.setState({
        isLoading: true,
    });
    firebase.firestore().collection('Data').onSnapshot((querySnapshot) => {
        if (querySnapshot.empty) {
            console.log('empty');
            this.setState({
                isLoading: false,
            });
            this.props.changeData([]);
        }
        querySnapshot.docChanges().forEach(change => {
            const doc = change.doc;
            const {
                Image
            } = doc.data();
            const item = doc.data();
            item.docId = doc.id;
            return new Promise(async() => {
                await FileSystem.downloadAsync(
                    Image,
                    `${FileSystem.documentDirectory}${Date.now()}.jpg`,
                ).then((url) => {
                    item.localImage = url.uri;
                    this.setState({
                        isLoading: false,
                    });
                    if (change.type === 'added') {
                        console.log('added');
                        myData.push(item);
                        this.props.changeData(myData);
                    } else if (change.type === 'removed') {
                        myData.push(item);
                        const newData = myData.filter(task => task.docId !== doc.id);
                        return this.props.changeData(newData);
                    } else if (change.type === 'modified') {
                        console.log('modified');
                    }
                }).catch((e) => {
                    Alert.alert('Error occured while fetching data');
                    console.log(e);
                });
            });
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...