Попытка удалить индекс просмотра выше ошибки подсчета числа

Что это значит? Это происходит, когда я обновляю список повторяющихся представлений, например

<View style={{ flexDirection: 'row', padding: 20, backgroundColor: '#fff' }}>
  <Ionicons name={jobIcon} color={theme.iconColor} size={30} />
  <Text>{jobService}</Text>
  <Text>{jobDate}</Text>
</View>

отображаемый внутри прокрутки.

эта ошибка появляется, когда я изменяю массив из детской сцены. scene1 - это где ScrollView с массивом представлений заданий sence2 - это где я удаляю задание и должен обновлять сцену1, когда я удаляю задание

введите описание изображения здесь

Ответ 1

В моем случае я использовал LayoutAnimation для своего ScrollView. Внутри это карта предметов. Когда элемент удален из списка, это происходит. Не использовать LayoutAnimation работает нормально.

Ответ 2

Это происходит, когда вы вызываете анимацию макета, когда она уже в процессе. iOS покажет предупреждение, в то время как Android взорвется с этой ошибкой. Вы можете использовать этот простой шаблон, чтобы исправить его, когда вы используете LayoutAnimation из того же компонента.

layoutAnimation()  {
  if (!this.layoutAnimationActive) {
    this.layoutAnimationActive = true;
    LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInOut, () => { this.layoutAnimationActive = false; });
  }
}

Ответ 3

Это происходит, когда компонент имеет только х количество детей, но вы пытаетесь удалить ребенка с индексом, большим, чем x. Подобно исключению индекса за пределами исключения, которое является общим с массивами. Может вызвать много разочарования, потому что часто раз ребенок, которого вы пытаетесь удалить DOES INFACT EXIST. Но может случиться, что вы используете сторонний компонент, который ожидает только определенное количество детей.

Для меня это случилось, когда я добавил дополнительный ребенок в airView bnb MapView. Я исправил проблему, сделав этот элемент дочерним элементом этого дедушки (он был абсолютно позиционирован, поэтому он не повлиял на стиль).

Ответ 4

Это может произойти, если вы используете некоторые собственные компоненты, где некоторые ViewManager возвращает LayoutShadowNode в createShadowNodeInstance ViewGroupManager или что-то, расширяющее ReactShadowNode в createShadowNodeInstance ViewManager на Android, и RCTShadowView в методе shadowView RCTViewManager на iOS. Но возвращает null/nil для другого View в другом ViewManager.

Затем, если вы объединяете дочерние элементы обоих типов в одном и том же родительском элементе, и любой из элементов без shadowViews/Nodes предшествует изменяющемуся количеству элементов, которые имеют shadowViews/Nodes, то индексы не будут совпадать, и RCTUIManager на iOS и NativeViewHierarchyManager на Android будут подавлять и создавать эти исключения.

Недавно я решил аналогичную проблему вact-native-svg, заставив все ViewManager возвращать значения, а не ноль/ноль. https://github.com/facebook/react-native/issues/23350

Итак, попробуйте обновить response-native-svg до v9.2.4, и проблема может быть решена. Или попробуйте переместить IonIcons в конец своих детей.

Ответ 5

В моем случае я удалял элемент в виртуализированном списке. Я использовал избыточность для управления данными списка и обновил список новыми данными. Однако компонент для элемента, который был удален, вызвал эту ошибку.

Я решил эту проблему, добавив логическое свойство состояния для этого компонента элемента, например "hideItem". Мой элемент был компонентом класса, но для функционального компонента также можно было использовать хук setState. Я установил это на true после удаления. Запись правильно спрятана с анимацией макета, и когда страница обновилась, она больше не отображала удаленный элемент. Следовательно, ошибка исчезла на Android без необходимости использовать LayoutAnimation.

Ответ 6

Очевидно, что эта ошибка может показывать свое уродливое лицо в различных условиях. После нескольких часов отладки я обнаружил, что моей основной причиной является ключевая опора, передаваемая компоненту, который в этом не нуждается. Я до сих пор не уверен, почему это вызвало сбой, однако я подозреваю, что это связано с тем, что компонент принимает ключ как уникальный способ идентификации представления, но также использовал метод жизненного цикла componentWillReceiveProps(props: *), который обновлено состояние компонента.