Ужасная производительность перевернутого Flatlist на Android, когда на экране много текста
Я создаю приложение для чата и с тех пор
React-Native
версия
0.63
, У меня ужасная производительность, когда в перевернутом Flatlist на Android используются длинные тексты.
Вот репродукция закуски, демонстрирующая проблему (видна только при попытке использовать физический телефон Android).
Я сообщил об ошибке. Это должно быть довольно вопиющим для любого, кто создает приложение для чата с перевернутым Flatlist, но почему-то я не вижу, чтобы об этой проблеме нигде говорили.
Это заставило меня подумать, что, может быть, другие как-то решили это? Если да, то как я могу это решить? Из-за этого мое приложение сейчас практически невозможно использовать.
2 ответа
Я решил это, применив стиль к плоскому списку и представлению рендеринга. Это какая-то проблема с android 11, так как в предыдущих версиях этого не было с перевернутыми списками. добавить стиль
scaleY: -1
в плоский список и в контейнер представления, которое вы собираетесь визуализировать, например:
return (
<FlatList
// ...
style={{scaleY: -1}}
renderItem={({item}) => {
return (
<View style={{scaleY: -1}}>
{/* cell content */}
</View
);
}}
>
);
Собственно,
Flatlist
компонент был написан лучше, чтобы иметь лучшую производительность, чем другие компоненты списка, такие как
ScrollView
. Но вы должны учитывать несколько принципов для очень длинного списка, такого как чат:
Уникальный ключ: для того, чтобы иметь уникальные ключи для кеширования и переупорядочивания наилучшим образом, это ВЫ должны передать уникальный ключ, потому что
ReactJS
просто используйтеitem.key
а если его нет, тоReactJS
использоватьindex
и это корень проблемы с производительностью, SO, вы должны использовать подпорку это имяkeyExtractor
и сделать хорошую функцию для создания уникальных ключей.Пропуск измерения динамического содержимого: чтобы избежать повторного вычисления измерений элементов при каждом повторном рендеринге, вы можете использовать опору с именем
getItemLayout
и пройтиwidth
,height
,offset
,index
и т.д. добавлениеgetItemLayout
может помочь вам значительно повысить производительность для длинных списков с несколькими элементами.Определить количество начальных элементов: вы можете определить количество элементов для загрузки и не показывать видимые элементы, это может быть немного сложно, но я думаю, используя
initialNumToRender
может помочь вам при начальной загрузке, после начальной вы можете обрезать видимые элементы, которые не отображаются на экране просмотра.Удалить обрезанные элементы: для этого вы можете использовать имя опоры, которое
removeClippedSubviews
но заботьтесь об этом. возможно, в некоторых ситуациях есть ошибка.
По моему опыту, эти способы могут улучшить производительность длинных списков. Я надеюсь, что это поможет вам, и, возможно, есть еще несколько уловок для повышения производительности.