React-Native một container khác được hỗ trợ VirtualizedList


39

Sau khi nâng cấp lên phản ứng gốc 0,61 tôi nhận được rất nhiều cảnh báo như thế:

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

Cái gì khác VirtualizedList-backed containermà tôi nên sử dụng, và tại sao bây giờ lại khuyên không nên sử dụng như vậy?


3
Bạn thực sự nên hiển thị một số mã
Variag

Câu trả lời:


27

Nếu ai đó vẫn đang tìm kiếm một đề xuất cho vấn đề mà @Ponleu và @David Schilling đã mô tả ở đây (liên quan đến nội dung vượt trên FlatList), thì đây là cách tiếp cận tôi đã thực hiện:

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

Bạn có thể đọc thêm về điều này tại đây: https://facebook.github.io/react-native/docs/flatlist#listheadercomponent

Hy vọng nó sẽ giúp được ai đó. :)


1
Bạn có biết tại sao điều này nên tốt hơn sau đó là cách cảnh báo được tạo ra?
David Schilling

2
@DavidSchilling vì cách bạn đã thử kết quả với 2 thùng chứa cuộn: ScrollViewFlatList- bạn sẽ có hành vi cuộn không nhất quán. Cách trình bày trong câu trả lời này chỉ dẫn đến 1 thùng chứa cuộn và trong Header / Footer, bạn có thể đặt bất kỳ chế độ xem nào, bất kể phức tạp như thế nào.
Variag

Tôi đang sử dụng thành phần chức năng và đã gặp sự cố kết xuất lại ContentThatGoesA UpperTheFlatList. Bất kỳ giải pháp nào về điều này
Ponleu

1
@Ponleu Bạn có thể ghi nhớ thành phần ContentThatGoesA UpperTheFlatList của mình bằng cách sử dụng useMemohook do React cung cấp, để tránh tái hiện. Thêm thông tin ở đây: Reacjs.org/docs/hooks-reference.html#usememo Hãy để tôi nếu nó hữu ích. :)
Afraz Hussain

9

Chỉ trong trường hợp điều này giúp được ai đó, đây là cách tôi sửa lỗi trong trường hợp của mình.

Tôi đã có một FlatListlồng bên trong một 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>
    );
}

và tôi đã thoát khỏi ScrollViewbằng cách sử dụng FlatListđể kết xuất mọi thứ tôi cần, loại bỏ cảnh báo:

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

Nhìn vào các ví dụ trong tài liệu tôi đã thay đổi container từ:

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

đến:

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

và tất cả những cảnh báo đó đã biến mất


6
Điều gì xảy ra nếu tôi kết xuất nội dung FlatListbên trên ScrollViewvà muốn nội dung đó có thể cuộn được?
Ponleu

Đó không phải là trải nghiệm người dùng tốt khi có hai chế độ xem có thể cuộn bên cạnh nhau. Tôi sẽ cố gắng lồng nó như thế này: '<View> <ScrollView> <Content /> </ ScrollView> <FlatList ... /> </ View>' (không được kiểm tra)
Variag

Tôi khá chắc chắn FlatList sẽ không tạo ra một cuộn khác, trừ khi chúng tôi bọc nó sang một bên chứa một chiều cao được chỉ định.
Ponleu

1
tôi có cùng một vấn đề như @Ponleu. Tôi có một ScrollViewnội dung của một số nội dung và sau đó FlatListcũng là một bên trong ScrollView. Và tôi muốn toàn bộ màn hình cuộn lại với nhau.
David Schilling

2
Làm thế nào để giải quyết vấn đề này trong Android ??
MD. IBRAHIM KHALIL TANIM


0

Cảnh báo xuất hiện bởi vì ScrollViewFlatListchia sẻ cùng một logic, nếu FlatListchạy bên trong ScrollView, nó sẽ bị trùng lặp

Bằng cách SafeAreaViewnày không hiệu quả với tôi, cách duy nhất để giải quyết là

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

Lỗi biến mất


0

Tôi đã thử một số cách để giải quyết vấn đề này, bao gồm ListHeaderComponenthoặc ListFooterComponent, nhưng tất cả đều không phù hợp với tôi.

bố cục tôi muốn đạt được là như thế này và tôi muốn được cuộn vào một lần.

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

Trước tiên tôi muốn nói lời cảm ơn tới này vấn đề và ý kiến, trong đó đã cho tôi bó ý tưởng.

Tôi đã nghĩ về các ListHeaderComponentvị trí phía trên Danh sách phẳng, nhưng vì hướng của tôi Flatlistlà cột, tiêu đề tôi muốn đặt ở bên trái của Flatlist:(

Sau đó, tôi đã phải cố gắng vào VirtualizedList-backedđiều. Tôi chỉ cố gắng đóng gói tất cả các thành phần VirtualizedList, trong đó renderItemsđưa ra chỉ mục và ở đó tôi có thể chuyển các thành phần một cách có điều kiện renderItems.

Tôi có thể đã làm việc này với Flatlist, nhưng tôi chưa thử.
Cuối cùng nó trông như thế này.

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

và tất nhiên có thể cuộn toàn bộ màn hình.


-6

Vấn đề này xảy ra khi bạn đang sử dụng <FlatList />bên trong <ScrollView>với cùng một định hướng.

Để khắc phục điều này, chỉ cần thêm "ngang" vào FlatList của bạn:

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

NB: FlatList của bạn sẽ hiển thị theo chiều ngang


bạn đã hiểu nhầm câu hỏi
Giorgi Gvimradze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.