Başka bir VirtualizedList destekli kapsayıcıyı yeniden etkinleştirme


39

Reaksiyon yerli 0.61 yükselttikten sonra böyle uyarılar bir sürü olsun:

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

VirtualizedList-backed containerKullanmam gereken diğer nedir ve neden böyle kullanmamanız tavsiye ediliyor?


3
Gerçekten bazı kodlar göstermelisiniz
Variag

Yanıtlar:


27

Birisi hala @Ponleu ve @David Schilling'in burada açıkladığı soruna bir öneri arıyorsa (FlatList'in üstündeki içerikle ilgili), o zaman benim aldığım yaklaşım budur:

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

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: https://facebook.github.io/react-native/docs/flatlist#listheadercomponent

Umarım birine yardımcı olur. :)


1
Bunun neden uyarının üretilişinden daha iyi olması gerektiğini biliyor musunuz?
David Schilling

2
@DavidSchilling, çünkü 2 kaydırma kapsayıcısı ile deneme şekliniz: ScrollViewve FlatList- tutarsız kaydırma davranışı elde edersiniz. Bu cevapta sunulan yol sadece 1 kaydırma kabı ile sonuçlanır ve Üstbilgi / Altbilgide ne kadar karmaşık olursa olsun herhangi bir görünüm koyabilirsiniz.
Variag

İşlev bileşenini kullanıyorum ve ContentThatGoesAboveTheFlatList yeniden oluşturma sorunu var. Bu konuda herhangi bir çözüm
Ponleu

1
@Ponleu Yeniden useMemooluşturmayı önlemek için React tarafından sağlanan kancayı kullanarak ContentThatGoesAboveTheFlatList bileşeninizi not edebilirsiniz . Daha fazla bilgi burada: reaktjs.org/docs/hooks-reference.html#usememo Yardımcı olduysa bana bildirin . :)
Afraz Hussain

8

Bunun birine yardım etmesi durumunda, benim durumumdaki hatayı böyle düzelttim.

FlatListİçinde bir yuva vardı 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>
    );
}

ve uyarıdan kurtulan ihtiyacım olan her şeyi oluşturmak için ScrollViewkullanarak FlatListkurtuldum:

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

Kapsayıcıdaki örneklere bakarak kapsayıcıyı değiştirdim:

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

için:

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

ve tüm bu uyarılar kayboldu.


6
Yukarıda içeriği oluşturmak durumunda ne FlatListiçi ScrollViewve istediğiniz içeriği kaydırılabilir olunur?
Ponleu

Yan yana iki kaydırılabilir görünüm olması iyi bir kullanıcı deneyimi değildir. Bunu şöyle iç içe yerleştirmeye çalışırdım: '<View> <ScrollView> <Content /> </ScrollView> <FlatList ... /> </View>' (test edilmedi)
Variag 9:09

FlatList'in başka bir kaydırma oluşturmayacağından eminim.
Ponleu

1
@Ponleu ile aynı problemim var. Bir var ScrollViewbir o bazı içerik içini ve FlatListaynı zamanda iç ScrollView. Ve tüm ekranın birlikte kaymasını istiyorum.
David Schilling

2
Android'de bu sorunu çözmek için nasıl?
MD. IBRAHIM KHALIL TANIM


0

Uyarı görünür ScrollViewve FlatListaynı mantığı paylaşır, FlatListiçeride çalıştırılırsa ScrollViewçoğaltılır

Bu arada SafeAreaViewbenim için çalışmıyor, çözmenin tek yolu

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

Hata kayboluyor


0

Bunu çözmek için bazı yollar denedim, ListHeaderComponentya da dahil ListFooterComponent, ama hepsi benim için uygun değildi.

ulaşmak istediğim düzen böyle ve bir kez kaydırılmak istedim.

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

Öncelikle bana bir sürü fikir veren bu konu ve yorumlar sayesinde söylemek istiyorum .

ListHeaderComponentFlatlist'in üstündeki yerleri düşünüyordum , ama benim yönüm Flatlistsütun olduğu için yerleştirmek istediğim başlık Flatlist: solda gitti :(

Sonra bir VirtualizedList-backedşey denemek zorunda kaldım . Sadece tüm bileşenleri paketlemeye çalıştım VirtualizedList, burada renderItemsdizin verir ve orada bileşenleri şartlı olarak geçebilir renderItems.

Bununla çalışabilirdim Flatlist, ama henüz denemedim.
Sonunda böyle görünüyor.

<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 />  

ve elbette tüm ekranı kaydırabilir.


-6

Bu sorun , aynı yönde <FlatList />içeride kullandığınızda gelir <ScrollView>.

Bunu düzeltmek için FlatList'inize "yatay" ekleyin:

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

Not: FlatList'iniz yatay olarak oluşturulacak


soruyu yanlış
anladınız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.