Есть ли способ исправить ошибку «Обнаружены двое детей с одним и тем же ключом» при реагировании на себя при отправке одаренных сообщений чата в firestore? - PullRequest
1 голос
/ 02 ноября 2019

Я настроил приложение реагировать на собственный групповой чат, используя одаренный пользовательский интерфейс чата с базой данных Firestore, но я продолжаю получать эту ошибку, когда запускаю приложение.

Предупреждение. Обнаружены два ребенка с одним и тем же ключом

enter image description here Кажется, ошибка исходит из метода getMessages

  parseMsgsFromFirestore = snapshot => {
    const { id: _id } = snapshot;
    const { text, user } = snapshot.doc.data();
    const stampInSeconds = snapshot.doc.data().timestamp.seconds;
    const timestamp = new Date(stampInSeconds * 1000);
    const message = {
      _id,
      timestamp,
      text,
      user
    };
    return message;
  };

  getMessages = callback => {
    firebase
      .firestore()
      .collection('messages')
      .orderBy('timestamp')
      .onSnapshot(snapshot => {
        const changes = snapshot.docChanges();
        // TODO: Warning: Encountered two children with the same key {Error occurs in about 5 minutes and then persists}
        changes.map(change => callback(this.parseMsgsFromFirestore(change)));
      });
  };

  sendMessages = messages => {
    // sending only specific properties to firestore
    for (let i = 0; i < messages.length; i++) {
      const { text, user } = messages[i];
      const message = {
        text,
        user,
        timestamp: firebase.firestore.Timestamp.fromDate(new Date())
      };
      this.concat(message);
    }
  };

  concat = message => {
    firebase
      .firestore()
      .collection('messages')
      .add(message);
  };

В моем файле Chat.js я вызываю этот метод вМетод componentDidMount.

import React, { Component } from 'react';
import { GiftedChat } from 'react-native-gifted-chat';
import fireStoreDB from '../database/FirestoreDB';

export default class Chat extends Component {
  static navigationOptions = ({ navigation }) => ({
    title: navigation.getParam('name')
  });

  constructor(props) {
    super(props);
    this.state = {
      messages: []
    };
  }

  componentDidMount() {
    fireStoreDB.getMessages(message =>
      this.setState(previousState => ({
        messages: GiftedChat.append(previousState.messages, message)
      }))
    );
  }

  componentWillUnmount() {
    fireStoreDB.signUserOut();
    fireStoreDB.snapOff();
  }

  get user() {
    return {
      // gifted chat user props
      name: this.props.navigation.getParam('name'),
      _id: fireStoreDB.uid
    };
  }

  render() {
    return (
      <GiftedChat
        messages={this.state.messages}
        onSend={fireStoreDB.sendMessages}
        user={this.user}
      />
    );
  }
}

Все мои ключи сообщений являются уникальными в базе данных, за исключением того, что все они имеют один и тот же идентификатор пользователя. All my keys are unique in the database.

1 Ответ

2 голосов
/ 02 ноября 2019

Похоже, в ваших данных отсутствуют уникальные _id поля. Как вы можете видеть из этой строки кода https://github.com/FaridSafi/react-native-gifted-chat/blob/master/src/MessageContainer.tsx#L281

key: item._id,

Это - key, на который она жалуется. Убедитесь, что в ваших сообщениях есть поле _id, и убедитесь, что они уникальны.

На данный момент у вас есть User._id, но у сообщения верхнего уровня также должен быть свой собственный _id.

const { text, user } = messages[i]; // Does this have _id ??
...