Я работаю с 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);
});
});
});
});
}