Слишком маленькая область прокрутки с помощью SectionList React Native

В настоящее время я пытаюсь использовать <SectionList> внутри классического <View>, все мои данные отформатированы, список отображается правильно и действия моего элемента работают.

Проблема в том, что когда я нахожусь в верхней части списка разделов, область, доступная для запуска прокрутки, на самом деле очень мала (примерно 100 пикселей от верхней части списка). Однако, как только я прокручиваю немного вниз из этой области, весь список становится прокручиваемым и работает так, как задумано, пока я не вернусь к началу.

В моем родительском представлении есть flex: 1, а также мой список разделов

Среда
Рабочая среда: MacOS Sierra 10.13.3
Экспо-версия: 23.0
Версия React Native: 0.50
Реакция: 16.0
Использование моделирования iPhone 8
На Android нет проблем

Действия по воспроизведению
Классическое создание списка разделов внутри представления

Ожидаемое поведение
Прокрутка должна запускаться из любого места в SectionList.

Фактическое поведение
Когда SectionList находится наверху, прокрутка срабатывает только внутри небольшой области (около 100 пикселей от верха списка).

Код моего списка разделов:

<View style = {{ flex: 1 }}>
      <SectionList
        style = {styles.openSectionList} // flex: 1
        scrollEnabled
        stickySectionHeadersEnabled
        sections = {this.sections}
        keyExtractor = {item => item["@id"]}
        removeClippedSubviews
        renderSectionHeader = {({ section }) => (
          <TouchableHighlight
            onPress = {() => this.onSectionHeaderPressRef(section.index)}
            activeOpacity = {0.65}
            underlayColor = "rgba(0, 0, 0, 0.2)"
            style = {styles.sectionHeader}
          >
            <View style = {styles.categoryContentContainer}>
              <View style = {styles.firstPartContent}>
                <Text style = {styles.categoryHeaderText}>
                  {section.title === "Autres"
                    ? "Mes produits"
                    : section.title}{" "}
                </Text>
                {section.nbItems - section.nbItemsSelected === 0 ? (
                  <CheckBox
                    label = ""
                    checked
                    checkboxStyle = {styles.checkbox}
                    checkboxContainer = {styles.checkboxContainer}
                  />
                ) : (
                  <Text
                    style = {[
                      styles.categoryHeaderText,
                      { color: Colors.contrastColor },
                    ]}
                  >
                    ({section.nbItems - section.nbItemsSelected})
                  </Text>
                )}
              </View>
              <Image
                source = {require("../../../assets/common/chevron.png")}
                style = {
                  section.index === this.state.currentCategoryOpen
                    ? styles.categoryChevronOpen
                    : styles.categoryChevronClosed
                }
              />
            </View>
          </TouchableHighlight>
        )}
        renderItem = {({ item }) =>
          this.state.currentCategoryOpen === item.categoryIndex ? (
            <ShoppingListProduct
              key = {item["@id"]}
              ingredient = {item}
              updateIngredient = {this.updateIngredientListRef}
              onLongPress = {this.itemLongPressedRef}
            />
          ) : null}
      />
  </View>

GIF с фактическим поведением (я пытаюсь прокручивать каждый раз, когда курсор перемещается), где мы видим, что прокрутка срабатывает только тогда, когда я нахожусь выше определенной высоты.

Гифка

Любая помощь будет принята с благодарностью, поскольку я не знаю, является ли это ошибкой и / или я неправильно реализую компонент.

Заранее благодарю.

Вы нашли решение этого?

Lazy 13.02.2019 06:40

@ Ленивый У меня была такая же или очень похожая проблема. Этот баг был только на iOS, Android работал отлично. После долгих проб и ошибок я обнаружил, что (вероятным) виновником на самом деле был stickySectionHeadersEnabled. При установке false все работает. Имейте в виду, что в iOS он включен по умолчанию. Попробую приготовить минимальную репродукцию.

rszalski 29.07.2019 19:33

@Clonescody у вас есть где-нибудь минимальный рабочий пример этой ошибки? Может на snake.expo.io?

rszalski 29.07.2019 19:35

@szalski Нет, к сожалению, это была старая версия моего приложения, и мы все переработали несколько месяцев назад. Извините за поздний ответ, надеюсь, вы сможете исправить свою проблему

Clonescody 30.01.2020 19:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
1 267
3

Ответы 3

Я добавил marginBottom к SectionList с равным объемом пространства, занимаемым View сверху, чтобы выровнять площадь.

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

Я не могу точно вспомнить, но в итоге я получил этот код (содержимое моей страницы меняется, поэтому он установлен как переменная)

// render method

component = ( <SectionList
     style = {styles.openSectionList} // flex: 1, height: "100%"
     scrollEnabled
     stickySectionHeadersEnabled
     sections = {this.sections}
     bounces = {false}
     keyExtractor = {item =>
         item["@id"] === undefined ? item.userIngredient : item["@id"]
     }
     getItemLayout = {this.getItemLayout}
     renderSectionHeader = {this.renderSectionListHeaderRef}
     renderItem = {this.renderSectionListItemRef}
 /> )

 return (
        <View style = {{ flex: 1 }}>
            {component}
        </View>
 )

Так что да, следите за тем, где определен ваш список разделов и сколько у него родителей, я думаю, что для этого нужен только один

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

Я смог исправить свою, добавив эту опору в список разделов stickySectionHeadersEnabled = {false}

Другие вопросы по теме