RN开发搬砖经验之-如何处理FlashList组件加载后调用scrollToIndex没有滚动指定位置

在这里插入图片描述

前言

如题,这里只能说是处理,起正向作用的临时方案,因为我也着实没搞懂这个BUG的具体原因,看github上有提相关的issuesFor long lists with different item types scrollToIndex does not work reliable,但看官方没有给出具体的解决方案!
在这里插入图片描述
我遇到的case跟上面issues差不多,都是long lists——即数据量比较大的列表,大概有500左右的数据项,然后上面是列表项是不同类型的(估计是聊天消息对框话之类的列表吧),但我这边列表项是同一种类型的,每个列表项需要显示一张小的缩略图以及相关的文字描述。
所以这个问题可以归类为长列表下当FlashList被加载后,马上调或延迟较少时间调scrollToIndex接口滚动到比较后面位置时,该接口可能不会按预期工作—没有滚动指定位置/指定列表项

问题场景

出现问题场景的前提
1、列表数据项500个左右
2、当列表被加载后,延迟几十ms再调scrollToIndex滚动到400项

结果:有概率没有滚动第400项,性能越差手机越容易重现,特别性能差的手机是必现的

抽像的示例代码如下:

import React, { useRef, useEffect } from 'react';  
import { View, Text, StyleSheet } from 'react-native';  
import FlashList from '@shopify/flash-list';  
  
const data = [  
  { id: 1, title: 'Item 1' },  
  { id: 2, title: 'Item 2' },  
  { id: 3, title: 'Item 3' },  
  // ...更多数据项  ,有500项
];  
  
const ItemComponent = ({ item }) => (  
  <View style={styles.item}>  
    <Text>{item.title}</Text>  
  </View>  
);  
  
const MyFlashList = () => {  
  const flashListRef = useRef(null);  
  
  useEffect(() => {  
    if (flashListRef.current) {  
      // 延迟执行滚动操作,确保列表已经渲染完成  
      setTimeout(() => {  
        flashListRef.current.scrollToIndex({ index: 400, animated: true });  
      }, 20);  
    }  
  }, []); // 空数组表示这个 effect 只在组件挂载和卸载时运行  
  
  return (  
    <FlashList  
      ref={flashListRef} // 将 ref 传递给 FlashList  
      data={data}  
      renderItem={({ item }) => <ItemComponent item={item} />}  
      keyExtractor={item => String(item.id)}  
      ItemSeparatorComponent={() => <View style={styles.separator} />}  
      estimatedItemSize={50}  
      maxToRenderPerBatch={10}  
      windowSize={21}  
    />  
  );  
};  
  
const styles = StyleSheet.create({  
  item: {  
    backgroundColor: '#f9c2ff',  
    padding: 20,  
    marginVertical: 8,  
    height: 50
  },  
  separator: {  
    height: 1,  
    backgroundColor: 'rgba(0, 0, 0, 0.1)',  
  },  
});  
  
export default MyFlashList;

临时方案

延时操作是必须的,如果延时2S,大多数手机都会正常的滚动到指定的位置,就算是UI加上loading,也是比较影响用户体验的!同时你也不能保持2S能兼容到你需要兼之的Android设备。延时能起到正向的作用,估计是跟FlashList的内部实现有关,当我们有做延时操作,意味着FlashList有时间在其它内部完全加载与真正完处理好数据与渲染,自然到我们调用滚动接口时就能滚动到我们期望的位置了。
我的临时方案是参考github上的小哥,但我比较保险一点,能提高Flash性能的相关配置我都用了,比如estimatedItemSize也配置,滚动时不需要动画等
在这里插入图片描述

即FlashList的配置如下,保险起见,getItemLayout也配置上,getItemLayout是FlatList的属性

// 50是列表项的高度值,这里是固定长度,且只有种列表项类型
    <FlashList  
      ref={flashListRef} // 将 ref 传递给 FlashList  
      data={data}  
      renderItem={({ item }) => <ItemComponent item={item} />}  
      keyExtractor={item => String(item.id)}  
      estimatedItemSize={83}
            getItemLayout={(data, index) => ({
              length: 50,
              offset: 50 * index,
              index,
            })}
            overrideItemLayout={(layout, item, index, maxColumns) => {
              layout.size = 50;
            }}
      windowSize={21}  
    />  

总结:以上临时方案是不在调整延时值的情况下,尽可能让scrollToIndex滚动到预期的位置,没有根本上解决与搞清楚相关的逻辑!

相关说明

FlatList也有类似的问题

[Auto scrollToIndex FlatList doesn’t work in long lists](Auto scrollToIndex FlatList doesn’t work in long lists)
在这里插入图片描述

FlashList的性能相关配置

https://shopify.github.io/flash-list/docs/fundamentals/performant-components
在这里插入图片描述

考虑方案

1、第一:从产品层出考虑,长列表数据加载后,定时给一两秒的个Loading的状态,再做滚动操作;
2、第二:从技术页面,分段分页加载长列表数据,这个就比较复杂,还要考虑处理滚动的目标处于那个分页等等逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/439722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操盘风控系统的功能设计与实现

文章目录 一、账户信息风控警报系统是什么二、操盘警报风控系统的意义三、风控系统功能参数设置短信通知及邮件通知参数手机远程风控新闻风险控制常规Bug检测、交易纪律控制参数账户净值、手数、单数、盈亏控制参数价格时间风控、定时平仓 一、账户信息风控警报系统是什么 警报…

WPF学习三(MVVM+自定义按钮等的登录界面)

跟着bilibil龙马哥视频做的一个登录界面&#xff0c;个人感觉讲得很到位&#xff0c;适合新手&#xff09;&#xff0c;他是从开始的前后绑定慢慢解耦合到MVVM&#xff0c;让我较快的理解了WPF的基础。 【WPF入门】WPF零基础到精通&#xff0c;从概念到实操&#xff0c;步步提升…

「AI工程师」模型训练与部署-工作指导

工作指导书 一、工作职责 负责AI模型的训练和优化&#xff0c;确保模型性能达到预定目标。协调资源的分配&#xff0c;管理训练过程中的各种参数和配置。负责模型的部署工作&#xff0c;确保模型能够稳定、高效地运行在实际环境中。监控模型的运行状态&#xff0c;及时处理和…

Python实现滚动加权最小二乘法回归模型(RollingWLS算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 滚动加权最小二乘法回归模型&#xff08;Rolling Weighted Least Squares, RollingWLS&#xff09;是一…

基于SSM的房客源信息管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM框架 3 1.2 Vue框架 3 1.3 ECharts 3 1.4 JQuery技术 3 1.5 本章小结 4 2系统分析 5 2.1 需求分析 5 2.2 非功能需求 8 2.3 本章小节 8 3 系统设计 9 3.1 系统总体设计 9 3.1.1 系统体系结构 9 3.1.2 系统目录结构 9 3…

MySQL 针对逗号拼接的数据字段转行思路

一、MySQL 针对逗号拼接的数据字段转行思路 在 MySQL 中我们有可能为了方便操作&#xff0c;有时会将一个字段存储多个信息&#xff0c;使用英文逗号隔开&#xff0c;当然这种情况属于对数据库的设计上有些欠妥。但如果遇到了这种情况又需要对数据进行统计的情况就有点棘手了&…

直流负载原理与应用

直流负载是指能够消耗直流电能的设备或系统&#xff0c;在电力系统中&#xff0c;直流负载主要包括直流电动机、蓄电池、电解槽等。这些设备在运行过程中需要消耗大量的直流电能&#xff0c;因此对直流电源的稳定性和可靠性要求较高。本文将对直流负载的原理及其应用进行简要介…

二叉树(属性、修改与构造)

226. 翻转二叉树 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]答案 class Solution {public TreeNode invertTree(TreeNode roo…

python3安装chrome,chromedriver亲测有效

客户用python写了个脚本&#xff0c;需要用到chrome和chromedriver扩展&#xff0c;结果说安装不了&#xff0c;各种报错&#xff0c;好吧我来研究一下。众所周知linux自带python2.7&#xff0c;根据报错查了一下资料发现是版本冲突导致的&#xff0c;系统自带2.7&#xff0c;代…

针对ETC系统的OBE-SAM模块设计方案

ETC&#xff08;Electrical Toll Collection&#xff09;不停车收费是目前世界上最先进的路桥收费方式。通过安装在车辆挡风玻璃上的车载单元与安装在收费站 ETC 车道上的路侧单元之间的微波专用短程通讯&#xff0c;利用计算机联网技术与银行进行后台结算处理&#xff0c;从而…

typescript 学习

一.typescript是Javascript的超集,在javascript中添加特性的语言扩展,支持ES6标准。 二.typescript中新增了:类型批注和编译时类型检查,类型推断,类型擦除,接口,枚举,Mixin,泛型编程,名字空间,元组,await等 三.vscode 中怎样使用typescript 1. 安装VSCode (官网下…

SSL 证书,了解一下常识

公司的网站、应用怎么才能保证在互联网上安全运行&#xff0c;不被攻击、盗取数据呢&#xff1f; 创业必经之路&#xff0c;一步一步走就对了&#xff0c;可能没赶上红利期&#xff0c;但不做就等于0。 概述 SSL 证书&#xff08;SSL Certificates&#xff09;又称数字证书&am…

常见控件应用

常见控件应用 1.操作Ajax选项2.滑动滑块操作 1.操作Ajax选项 Ajax即Asynchronous JavaScript and XML&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式、快速动态网页应用的网页开发技术。通过在后台与服务器进行少量数据交换&#xff0c;Ajax可以…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声&#xff0c;图像的能量主要集中在低频部分&#xff0c;而噪声和图像边缘信息的能量主要…

Spring Boot 生成与解析Jwt

Spring Boot 生成与解析Jwt Maven依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>生成&解析 package yang;import io.jsonwebtoken.Claims…

DDS技术概述及测试策略与方案

随着车载通信技术的快速发展&#xff0c;传统的通信技术在满足车载通信需求方面面临着一些挑战。车载通信对实时性、可靠性以及通信带宽的需求越来越高&#xff0c;同时车载通信环境存在多路径衰落、信号干扰等问题&#xff0c;这些都给通信技术的选择和应用带来了一定的挑战。…

沐风老师3DMAX快速布尔QuickBoolean插件安装和使用教程

3DMAX快速布尔QuickBoolean插件安装和使用教程 3DMAX快速布尔QuickBoolean插件是一组工具&#xff0c;用于对具有预设轮廓的当前选定对象快速执行ProBoolean运算&#xff0c;如并集、相交、空心、修剪、减法、拆分和刀。 它的工作原理与SketchUp的Solid Tools非常相似&#xf…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt&#xff0c;让Qt自己识别系统环境&#xff0c;不知道为什么Qt在之后的版本&#xff0c;这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator&#xff0c;感觉失去了一些灵活性。 自己测试…

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法前言第1章 配置ST-LINK下载器第2章 配置DAP下载器总结 前言 这个软件编译完之后&#xff0c;可以使用下载器进行在线下载程序或仿真调试程序&#xff0c;也…

高效办公-电脑软件安装简介

之前大概了解了一下应用软件就是在操作系统上面安装的一些办公软件。今天来学习下怎么下载软件、怎么安装、怎样卸载&#xff1f; 一、软件类型 电脑操作系统上可以根据自己的需求按照许多软件实现办公、影音娱乐等功能&#xff0c;大概分类有下面的一些&#xff0c;但是只是一…