Как избежать переоценки товара после заданного состояния? - PullRequest
1 голос
/ 19 октября 2019

У меня есть функция для получения данных из firebase, и я хочу установить данные в состояние после получения, поэтому я просто объявляю массив и помещаю в него все данные, после чего я устанавливаю этот массив с моим состоянием

Но когда я регистрирую это состояние или отображаю его, у меня возникают некоторые проблемы с RN 0.61.2, он отлично работает в RN 0.58.0 Я не знаю почему / как !!!

когда я регистрирую состояние, я просто вижу переоцененные данные "У меня просто 4 элемента в БД", но регистратор печатает мне больше десятков, и когда я просто передаю эти данные "состояние", они говорят мне

Значение JSON "5" типа NSNumber не может быть преобразовано в Nsstring

Итак, как мне этого избежать?

вот мой код Фрагмент

  this.state = {
      RecommendedProviders: [],
}

componentDidMount() {
      this._recommendedProvider();
}

_recommendedProvider = () => {
    let Recommended = [];
    firebase
      .database()
      .ref('recommendationProviders')
      .once('value')
      .then(snapshot => {
        snapshot.forEach(childSnapshot => {
          Recommended.push({
            gKey: childSnapshot.key,
            id: childSnapshot.val().id,
            username: childSnapshot.val().username,
            service: childSnapshot.val().service,
            aboutMe: childSnapshot.val().aboutMe,
            coordinates: {
              longitude: childSnapshot.val().coordinates.longitude,
              latitude: childSnapshot.val().coordinates.latitude,
            },
            city: childSnapshot.val().city,
            mobileNumber: childSnapshot.val().mobileNumber,
            token: childSnapshot.val().token._55,
          });
        });
        console.log('Recommended', Recommended); //when i log this i can just see array of 4 item
        this.setState({RecommendedProviders: Recommended});
      });
    //   .then(() => this.setState({RecommendedProviders: Recommended}));
  };

UI

<FlatList
     horizontal
     data={this.state.RecommendedProviders}
     renderItem={({item}) => {
        console.log('@item/', item); /when i log this i can just see more than 4 item maybe 20 :D
     }}
    keyExtractor={(item, index) => index.toString()}
/>

1 Ответ

1 голос
/ 19 октября 2019

Хорошо, сначала об этом регистраторе:

Значение JSON "5" типа NSNumber не может быть преобразовано в Nsstring

Эта ошибка вызвана тем, что keyExtractor ожидаетстрока как возвращаемое значение. Таким образом, чтобы избежать этого, вы можете попробовать это:

<FlatList
    keyExtractor={(item, index) => 'item' + index}
/>

Наконец, о вашем журнале:

Я создал закусочную экспозиции с вашей сущностью, SDK которой основан на реакции-нативной 0,59Вы можете проверить это здесь . Я также попытался смоделировать вашу асинхронную выборку с помощью приведенного ниже кода, и он работал нормально.

new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, [
    { id: 1, username: 'test', service: 'example' },
    { id: 2, username: 'test', service: 'example' },
    { id: 3, username: 'test', service: 'example' },
    { id: 4, username: 'test', service: 'example' },
  ]);
}).then(res => {
  const providers = [];

  res.forEach(item => providers.push(item));

  this.setState({ RecommendedProviders: providers }, () =>
    console.log('object', this.state.RecommendedProviders)
  );
});

Я считаю, что это может быть решением для понижения версии RN, если это не окажет негативного влияния на ваше приложение.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...