React-Native別のVirtualizedList-backedコンテナー


39

反応ネイティブ0.61にアップグレードした後、次のような警告がたくさん表示されます。

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

私がVirtualizedList-backed container使用するべき他のものは何ですか?なぜ今それをそのように使用しないように勧められているのですか?


3
あなたは本当にいくつかのコードを表示する必要があります
Variag '16

回答:


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の理由は、2つのスクロールコンテナーで結果を試したためです。ScrollViewそしてFlatList-一貫性のないスクロール動作が発生します。この回答で提示された方法では、スクロールコンテナーは1つだけになり、ヘッダー/フッターでは、どんなに複雑なビューでも配置できます。
Variag

関数コンポーネントを使用していますが、ContentThatGoesAboveTheFlatListの再レンダリングの問題が発生しました。これに関する解決策
ポンルー

1
@Ponleu useMemoReactが提供するフックを使用してContentThatGoesAboveTheFlatListコンポーネントをメモし、再レンダリングを回避できます。詳細については、こちらをご覧ください:reactjs.org/docs/hooks-reference.html#usememo参考になればお知らせください。:)
Afraz Hussain

9

これが誰かを助けるために、これは私が私の場合にエラーを修正した方法です。

私は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

2つのスクロール可能なビューを並べて表示することは、ユーザーエクスペリエンスとしてはよくありません。'<View> <ScrollView> <Content /> </ ScrollView> <FlatList ... /> </ View>'(テストされていません)
Variag

高さを指定してコンテナの横にラップしない限り、FlatListが別のスクロールを作成しないと確信しています。
Ponleu、

1
@Ponleuと同じ問題があります。私はScrollViewその一部のコンテンツの内部にあり、次にFlatListも内部にありScrollViewます。そして、私は画面全体が一緒にスクロールすることを望みます。
David Schilling、

2
アンドロイドでこの問題を解決する方法??
MD。イブラヒム・ハリル・タニム


0

同じロジックScrollViewFlatList共有しているため警告が表示され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>を同じ向きで使用しているときに発生します。

これを修正するには、単に "horizo​​ntal"をFlatListに追加します。

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

注意:FlatListは水平にレンダリングされます


あなたは質問を誤解しました
Giorgi Gvimradze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.