简介:解决flutter复杂布局过程以及对基础能力进行扩充的列表视图解决方案

作者:闲鱼技术-夜澜

背景

目前闲鱼业务中无论是首页还是搜索页都有大量可以落地瀑布流的场景,而在Flutter原生中只提供了ListView, GridView,无法提供自定义布局的能力。

而在社区中,一般瀑布流的解决方案都是基于SliverMultiBoxAdaptor对其performLayout进行定制,主要存在的问题是缺乏复用机制,并且在很多情形下容易出现重复布局,在线上业务的复杂场景下容易出现帧数偏低的问题, 闪屏的问题。同时对于Child生命周期,打点曝光等一系列基础功能的支持还是一片空白的状态。

所以,我们迫切需要一个更为通用的可以解决复杂布局过程同时能够对基础能力进行扩充的列表视图解决方案。

Flutter中的列表视图简介

1. Scrollable

Scrollable是一个StatefulWidget, 职责是监听用户的手势输入。其State的build方法会返回一个含有Listener和RawGestureDetector的ViewportScrollPosition用于描述其位置信息,并在其内部定义了 onStart, onUpdate, onEnd等回调。Scrollable中的每一次滑动的开始到结束都对应于一个Darg对象,并且会发送滑动的通知。而Viewport则负责对通知进行监听。

2. Sliver

Flutter有两种布局体系 Box, Sliver。在layout的过程中,每个Sliver 都接收 SliverConstraints 计算返回一个 SliverGeometry,可以类比于RenderBox 接收 BoxConstraints 返回一个 Size。Sliver由Viewport统一来负责进行管理。

3. Viewport

A widget that is bigger on the inside.

Viewport持有一个或多个Sliver。Scrollable将offset传递给Viewport, 由Viewport决定哪些Sliver应该是Visible。Viewport本质上是一个MultiChildRenderObjectWidget,也就是整个滚动视图的主要渲染逻辑都在Viewport中完成。

而在performLayout中,_attemptLayout会以center为中心,先布局leading方向的child,再布局trailing方向的child。其中只有dirty的child会被布局。

do {correction = _attemptLayout(mainAxisExtent, crossAxisExtent, offset.pixels + centerOffsetAdjustment);if (correction != 0.0) {offset.correctBy(correction);} else {if (offset.applyContentDimensions(math.min(0.0, _minScrollExtent + mainAxisExtent * anchor),math.max(0.0, _maxScrollExtent - mainAxisExtent * (1.0 - anchor)),))break;}count += 1;
} while (count < _maxLayoutCycles);

如果_attemptLayout返回了一个非0的correction, 就会打断当前布局的过程,需要对offset进行调整后重新开始布局,最多只能连续打断10次(_maxLayoutCycles)。

correction用于调整,举个

Flutter瀑布流及通用列表解决方案相关推荐

  1. Flutter 瀑布流效果

    前言 : 各位同学大家好, 瀑布流列表显示效果相信在坐的同学中做过原生安卓 和iOS的同学都有实现过吧. 原生的实现方式网上都很多开源例子甚至是开源库 ,我就不展开讲了.今天我主要给大家介绍下flut ...

  2. android移动支付——微信支付,flutter瀑布流内存

    我们这里主要是来学习一下支付宝,微信支付,银联支付和paypal支付 现实生活中的支付就是:去商店浏览商品->把商品加入购物车->把购物车中的商品拿到收银台付款 上面的支付流程细化下来就是 ...

  3. JS——瀑布流无限加载以及动态生成a标签

    如何实现瀑布流排列效果?看下面这张图 通过js去比较每张图片的高度,然后进行排列. 这是一个模拟的瀑布流的list列表项 <div id="main"><div ...

  4. 图片瀑布流ios中部分显示空白

    @ios中的web页面图片布局闪动或者显示空白之类问题的解决方法 出现问题的代码(问题现象:ios手机中 商品图片 只有少部分加载成功其余出现大量空白 ) 现在购买再送 80% .pro_img im ...

  5. Android之自定义瀑布流式的标签列表

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50965588 本文出自:[顾林海的博客] ##前言 由于一些原因,马上 ...

  6. 微信小程序瀑布流列表

    客户讲列表不好看要瀑布流,搞了半天没搞好,一行两列,总是高度高的决定一行的高度,flex解决不了 找了网上的方法.有个比较暴力的思路:整个页面左右分成两列,单列只显示一篇文章的宽度,左列显示奇数,右列 ...

  7. 织梦ajax加载文章列表,织梦dedecms首页列表页ajax点击下拉加载更多文章瀑布流效果...

    织梦dedecms实现点击下拉加载更多主要用到ajax技术.具体步骤如下: 一.首先找到并打开/plus/list.PHP文件,在里面找到如下代码: require_once(dirname(__FI ...

  8. 堆糖瀑布流完整解决方案(jQuery)

    2010年堆糖创办以来,网站界面经历过3-5次重大改版,logo也曾更换过两次,早期蓝红相间三个圈的logo恐怕很少有人记得了.与此同时,前端 js 框架也在默默的更新换代.最早堆糖上线时,js 采用 ...

  9. html瀑布流下拉刷新,Flutter笔记(六):StaggeredGridView瀑布流+下拉刷新和加载更多...

    前言 Flutter中有对应的ListView和GridView但是没有提供瀑布流的展示,这里我们使用现在比较火的瀑布流组件flutter_staggered_grid_view example_01 ...

最新文章

  1. 【Linux】3.dpkg、apt安装卸载软件
  2. 优化DOTTEXT之二:缓存用户控件
  3. ITK:使用Deformation Field扭曲图像
  4. OpenvSwitch VxLAN实验
  5. Sonatype Nexus 库被删除的恢复方法
  6. Easy-mock让团队协作效率提高不止一点点
  7. t-sql还原数据库_如何更新T-SQL工具箱数据库
  8. win10 pin码如何设置
  9. struts2与spring整合问题,访问struts2链接时,spring会负责创建Action
  10. backlog配置_Nginx backlog配置概述
  11. SQL基本语句(整理)
  12. nvivo三天写论文!社会网络分析实战
  13. 花了三天三夜才收集整理出来的经典 SQL 数据库笔试题及答案
  14. 电视hdr测试软件,HDR+4K一个都不能少 本地资源播放测试
  15. Springboot毕设项目基于SpringBoot的个人理财系统ibx9hjava+VUE+Mybatis+Maven+Mysql+sprnig)
  16. 【12】Kotlin函数泛型协程
  17. [转]飞鸟集 Stray Bird
  18. 数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
  19. 锚框之间的IOU理解
  20. 使用阿里云视频点播上传视频

热门文章

  1. JBPM学习笔记(1)
  2. Python 强大的信号库 blinker 入门教程
  3. 中文版开源!最最最经典的Python编程教材强势来袭~
  4. 连不上 GitHub 的朝鲜,也开发出了人脸识别技术
  5. 安装ie9提示未能完成安装_IE9浏览器无法安装怎么办?如何解决?
  6. 向腾讯云windows服务器传输文件,如何上传本地文件到腾讯云Windows服务器上?
  7. unity 输入框弹出输入法_效率提升300%,百度输入法正式更新,手写输入全面升级...
  8. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-Tensorflow2.2-cpu/gpu环境安装-01
  9. c语言四字节转浮点数_C语言浮点书于字节互相转换
  10. mysql服务器多线程模型_mysql-线程模型