Інший контейнер, підтримуваний VirtualizedList, React-Native


38

Після оновлення до реальної 0,61 я отримую багато попереджень:

VirtualizedLists should never be nested inside plain ScrollViews with the same orientation - use another VirtualizedList-backed container instead.

Що ще, VirtualizedList-backed containerщо я повинен використовувати, і чому зараз радять не користуватися таким?


3
Ви повинні дійсно показати код
Варяг

Відповіді:


27

Якщо хтось все ще шукає пропозицію щодо проблеми, яку описали тут @Ponleu та @David Schilling (щодо вмісту, який виходить вище FlatList), то це такий підхід, який я взяв:

<SafeAreaView style={{flex: 1}}>
    <FlatList
      data={data}
      ListHeaderComponent={ContentThatGoesAboveTheFlatList}
      ListFooterComponent={ContentThatGoesBelowTheFlatList} />
</SafeAreaView>

Більше про це можна прочитати тут: https://facebook.github.io/react-native/docs/flatlist#listheadercomponent

Сподіваємось, це комусь допомагає. :)


1
Чи знаєте ви, чому це повинно бути краще, ніж спосіб отримання попередження?
Девід Шиллінг

2
@DavidSchilling, оскільки те, як ви спробували результати з двома контейнерами прокрутки: ScrollViewі FlatList- ви отримаєте непослідовну поведінку прокрутки. Спосіб, представлений у цій відповіді, дає лише 1 контейнер прокрутки, і в заголовку / колонтитулі ви можете розмістити будь-який вид, незалежно від того, наскільки складний.
Варяг

Я використовую функціональний компонент і отримав проблему ContentThatGoesAboveTheFlatList для повторного відтворення. Будь-яке рішення з цього приводу
Ponleu

1
@Ponleu Ви можете запам’ятати свій компонент ContentThatGoesAboveTheFlatList, використовуючи useMemoгачок, передбачений React, щоб уникнути повторного відображення. Більше інформації тут: reactjs.org/docs/hooks-reference.html#usememo Дозвольте мені, якщо це корисно. :)
Афраз Хуссейн

8

Про всяк випадок, коли це комусь допомагає, саме так я виправив помилку у своєму випадку.

Я FlatListвклав усередині ScrollView:

render() {
    return (
        <ScrollView>
            <h1>{'My Title'}</h1>
            <FlatList
                data={this.state.myData}
                renderItem={({ item }) => {
                    return <p>{item.name}</p>;
                }}
            />
            {this.state.loading && <h2>{'Loading...'}</h2>}
        </ScrollView>
    );
}

і я позбувся цього ScrollView, використовуючи, FlatListщоб зробити все необхідне, що позбулося попередження:

render() {
    const getHeader = () => {
        return <h1>{'My Title'}</h1>;
    };

    const getFooter = () => {
        if (this.state.loading) {
            return null;
        }
        return <h2>{'Loading...'}</h2>;
    };

    return (
        <FlatList
            data={this.state.myData}
            renderItem={({ item }) => {
                return <p>{item.name}</p>;
            }}
            ListHeaderComponent={getHeader}
            ListFooterComponent={getFooter}
        />
    );
}

4

Переглядаючи приклади в документах, я змінив контейнер з:

<ScrollView>
    <FlatList ... />
</ScrollView>

до:

<SafeAreaView style={{flex: 1}}>
    <FlatList ... />
</SafeAreaView>

і всі ці попередження зникли.


6
Що робити , якщо я винести зміст вище FlatListнутрощів ScrollViewі хочу , щоб зміст бути прокручувати?
Ponleu

Недостатньо зручно користувачеві мати два прокручувані види один на інший. Я хотів би спробувати гніздитися це так: '<View> <ScrollView> <Зміст /> </ ScrollView> <FlatList ... /> </ View>' (гість)
Варяг

Я впевнений, що FlatList не створить іншого прокрутки, якщо ми не загорнемо його в контейнер із заданою висотою.
Ponleu

1
У мене така ж проблема, як у @Ponleu. У мене ScrollViewвсередині є якийсь зміст, а потім FlatListтакож всередині ScrollView. І я хочу, щоб весь екран прокручувався разом.
Девід Шиллінг

2
Як вирішити цю проблему в android ??
д.м.н. ІБРАХІМ ХАЛІЛ ТАНІМ

0

На мою думку, я можу використовувати карту замість FlatList. Але в моєму випадку я не хочу показувати великий список. Якщо використання FlatList не спричинить ефективність роботи. тому я використав це для придушення попередження https://github.com/GeekyAnts/NativeBase/isissue/2947#issuecomment-549210509


0

Попередження з’являється тому, що ScrollViewі FlatListподіляють ту саму логіку, якщо FlatListпрацювати всередині ScrollView, воно дублюється

До речі SafeAreaView, для мене це не працює, єдиний спосіб вирішити це

<ScrollView>
    {data.map((item, index) => {
        ...your code
    }}
</ScrollView>

Помилка зникає


0

Я спробував кілька способів вирішити це, в тому числі ListHeaderComponentабо ListFooterComponent, але це все не підходило мені.

макет, який я хотів досягти, такий, і я хотів раз прокрутитись.

<ScrollView>
  <View>I'm the first view</View>
  <View>I'm the second view</View>
  <MyFlatList />
</ScrollView>

Спершу хочу сказати завдяки цьому питанню та коментарям, які дали мені купу ідей.

Я думав про ListHeaderComponentмісця, що стоять над Плоским списком, але оскільки в моєму Flatlistнапрямку був стовпець, заголовок, який я хотів розмістити, пішов зліва від Flatlist:(

Тоді мені довелося приміряти на себе VirtualizedList-backed. Я просто намагався запакувати всі компоненти VirtualizedList, де renderItemsдається індекс, і там я міг умовно передавати компоненти renderItems.

З цим я міг би попрацювати Flatlist, але ще не намагався.
Нарешті це виглядає приблизно так.

<View>
  <Virtualizedlist
    data={[]}
    initialNumToRender={1}
    renderItem={(props)=>{
      props.index===0 ? (1st view here) : props.index===1 ? (2nd view here) : (my flatlist)
    }}
    keyExtractor={item => item.key}
    getItemCount={2}
    getItem={ (data, index) => {
      return {
        id: Math.random().toString(12).substring(0),
      }
    }}
  />
</View>

(inside which lazyly renders↓)
  <View>I'm the first view</View>
  <View>I'm the second view</View>
  <MyFlatList />  

і, звичайно, в змозі прокрутити весь екран.


-6

Ця проблема виникає, коли ви використовуєте <FlatList />всередині <ScrollView>однакову орієнтацію.

Щоб виправити це, просто додайте "горизонтальний" до свого FlatList:

<ScrollView>
    <FlatList **horizontal** ... />
</ScrollView>

Примітка: Ваш FlatList відображатиметься горизонтально


ви неправильно зрозуміли питання
Giorgi Gvimradze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.