StreamBuilder 而不是 FutureBuilder 尽可能使用“StreamBuilder”而不是“FutureBuilder”。...“StreamBuilder”允许您在更新发生时接收更新,这有助于减少重建次数并提高性能。...CustomScrollView 而不是 ListView 尽可能使用“CustomScrollView”而不是“ListView”。...CustomScrollView( slivers: [ SliverList( delegate: SliverChildBuilderDelegate(...Dart 内置的 Profile 和 Release 模式来测试性能 使用 Dart 内置的“Profile”和“Release”模式来测试性能。
在Flutter开发的过程中,对CustomScrollView的使用是比较多的,这也是我们开发过程中比较重要和复杂的控件。 ?...又比如我们经常使用的PageView(它的原理与scrollView类似)。它要求每次滑动都是整页滑动。即使用户在滑动手抬起时,页面当前的offset位置还处于两个页面的过渡期间,不是一个整页。...又通过Controller与外界的CustomScrollView的使用者串联,让外界可以操控和获得CustomScrollView的滑动状态。...里面有个特殊场景会抛出Error的异常,我们在布局每个child的过程中,会把当前scrollview的offset作为输入给当前正在布局的child,而某些chid在做内部布局的时候,可能会认为scrollview...图21 SliverList单个child的销毁或回收 sliverList创建和回收每个scrollview的child的方法分别如图20和图21所示。
CustomScrollView CustomScrollView是使用Sliver组件创建自定义滚动效果的滚动组件,使用场景: ListView和GridView相互嵌套场景,ListView嵌套GridView...时,需要给GridView指定高度,但我们希望高度随内容而变化(不指定),ListView和GridView作为整体滚动效果。...,而是需要使用CustomScrollView+SliverGrid+SliverList来实现,实现代码如下: CustomScrollView( slivers: [ SliverGrid.count...滚动方向,分为垂直和水平方向。...primary设置为true时,不能设置controller,因为primarytrue时,controller使用PrimaryScrollController,这种机制带来的好处是父组件可以控制子树中可滚动组件的滚动行为
除了SliverAppBar之外,我们还可以为CustomScrollView添加List或者Grid来实现更加复杂的组合效果。 今天要向大家介绍的就是SliverList和SliverGird。...SliverList和SliverGird详解 从名字就可以看出SliverList和SliverGird分别是List和Grid的一种,他们和List与Grid最大的区别在于,他们可以控制子widget...SliverList和SliverGird的使用 有了上面介绍的SliverList和SliverGird的构造函数,接下来我们具体来看下如何在项目中使用SliverList和SliverGird。...默认情况下SliverList和SliverGird是需要和CustomScrollView一起使用的,所以我们先创建一个CustomScrollView,在它的slivers属性中,放入一个SliverAppBar...总结 在CustomScrollView中使用SliverList和SliverGird,可以实现灵活的呈现效果。
和尚在学习过程中会在一个 Page 页面同时用到 GridView 和 ListView 或多个 ListView,此时就会遇到常见的滑动冲突问题。...和尚尝试了两种解决滑动冲突的方案,仅记录一下基本的使用方式。和尚翻译很不到位,可重点看代码。...尝试一:CustomScrollView + sliver Flutter 提供了类似于 Android CollapsingToolbarLayout 的折叠效果,和尚借此了解到 CustomScrollView...CustomScrollView 允许包含多种滚动模型,例如列表/网格和扩展标题。但其子 Widget 必须为 sliver 类型的。...shrinkWrap 常用于内容大小不确定情况,如果滚动视图(ListView/GridView/ScrollView 等)没有收缩包装,则滚动视图将扩展到允许的最大大小。
举个例子,首先我们使用常见的 ListView 绘制出一个模拟聊天列表,这里使用了 reverse 反转列表满足 UI 需求,让列表从底部开始网上布局滑动: ListView.builder(...Viewport 里产生滑动; 黄色的部分就是 SliverList , 当我们滑动时其实就是它在 Viewport 里的位置发生了变化; 本来一切正常,但是当我们通过 insert 添加绿色部分的数据时...这时候就需要使用到 CustomScrollView,CustomScrollView 支持配置 center, 另外对于 CustomScrollView 是直接配置你需要的 slivers 数组。...前面我们说过 center 决定了 scrollOffset = 0 的位置,所以当我们如上面那样布局后,就等于有了从 0 ~ ♾️ 和从 -♾️ ~ 0 的范围,所以当我们 insert 数据到头部时...虽然实现很简单,但是如果不去对 Flutter 的滑动列表机制有所了解,就很容易对着 ListvView 陷入僵局,这篇文章也是为了给大家打开思路,提高对 ViewPort 和 Sliver 的了解。
聊天列表是一个很扣细节的场景,在之前的 《Flutter 实现完美的双向聊天列表效果,滑动列表的知识点》 里,通过 CustomScrollView 和配置它的 center 从而解决了数据更新时的列表跳动问题...SliverList 顶部空白的问题; image 结合这个问题,这里可以发现关键的点就在于 reverse ,而对比微信和QQ的聊天列表需求,在没有数据时,消息数据应该是从顶部开始,所以这时候就需要我们调整列表实现...image 如下代码所以,这里针对新交互场景做了优化调整: 去除 CustomScrollView 的 reverse ; 对调两个 SliverList 的位置,把加载 old 数据的 SliverList...放到 center 的前面; CustomScrollView( controller: scroller, center: centerKey, slivers: [ SliverList...比如增加判断列表是否处于底部,决定在接受到新数据时是否滑动到最新消息。
CustomScrollView 好了,ListView实现了单一视图下可滚动Widget的交互模型,同时也包含了UI显示相关的控制逻辑和布局模型。...这时,各自视图的滚动和布局模型就是相互独立、分离的,就很难保证整个页面统一一致的滑动效果。 那么,Flutter是如何解决多ListView嵌套时,页面滑动效果不一致的问题的呢?...接下来,我通过一个滚动视差的例子,与你演示CustomScrollView的使用方法。 视差滚动是指让多层背景以不同的速度移动,在形成立体滚动效果的同时,还能保证良好的视觉体验。...以一个有着封面头图的列表为例,我们希望封面头图和列表这两层视图的滚动联动起来,当用户滚动列表时,头图会根据用户的滚动手势,进行缩小与展开。...flexibleSpace 可以让背景图显示在SliverAppBar下方,高度和SliverAppBar一样; 而在创建SliverList时,通过 SliverChildBuilderDelegate
嵌套列表 - ShrinkWrap 与 Slivers 使用 ShrinkWrap 的列表列表 下面是一些使用ListView对象呈现列表列表的代码,内部列表的shrinkWrap值设置为 true。...当您滚动浏览此 UI 并注意该ColorBarState.build方法的调用方式时,会出现可怕的部分 。...使用 Slivers 的列表列表 下面的代码构建了与之前相同的 UI,但这次它使用Slivers 而不是收缩包装ListView对象。本页的其余部分将引导您逐步完成更改。...=> innerLists[index], ); } 变成: // After @override Widget build(BuildContext context) { return CustomScrollView...当您滚动时,会动态构建更多小部件,正如您所期望的那样。更好的是,一直滚动到下一个列表也不会产生任何特殊费用。 Flutter 会根据需要重新构建小部件,而且很快。
在使用python的multiprocess库时,如果在主进程中的处理子进程的返回函数callback或者处理子进程的错误的函数errorbackerror中抛出异常,则子进程无法退出。...(1)errorcallback中抛出异常 import multiprocessing import os import time import traceback def work(args):...res.get(): # print(r) pool.close() pool.join() task() 运行时: (2)解决办法 在errorcallback中使用...print(traceback.format_exc(3)) (3) 总结 在主进程中的处理子进程的返回函数callback或者处理子进程的错误的函数errorbackerror中使用
snapsnap是和floating一起使用的属性,snap表示当向SliverAppBar滚动的时候,SliverAppBar是否立即展示完全。...另外还有一个flexibleSpace组件,他是SliverAppBar在float的时候展示的widget,通常和expandedHeight配合使用。...SliverAppBar的使用上面讲解了SliverAppBar的构造函数和基础属性,接下来我们通过具体的例子来讲解SliverAppBar如何使用。...通常来说SliverAppBar是和CustomScrollView一起使用的,也就是说SliverAppBar会被封装在CustomScrollView中。...接着我们需要把SliverAppBar放到CustomScrollView中进行展示。
snap snap是和floating一起使用的属性,snap表示当向SliverAppBar滚动的时候,SliverAppBar是否立即展示完全。...另外还有一个flexibleSpace组件,他是SliverAppBar在float的时候展示的widget,通常和expandedHeight配合使用。...SliverAppBar的使用 上面讲解了SliverAppBar的构造函数和基础属性,接下来我们通过具体的例子来讲解SliverAppBar如何使用。...通常来说SliverAppBar是和CustomScrollView一起使用的,也就是说SliverAppBar会被封装在CustomScrollView中。...接着我们需要把SliverAppBar放到CustomScrollView中进行展示。
,等这种就可以直接使用 SliverAppBar,SliverList 和 SliverGrid Slivers 不是单独指一个组件,而是指的一个系列,所以以 Sliver 开头的组件都是这个系列的,但是他们都只能作用于...CustomScrollView 中。...常用到的 Sliver 有,SliverAppbar,SliverList,SliverGrid,SliverToBoxAdapter 等 由于 CustomScrollView 的子组件只能是 Sliver...并且 slivers 中,如果存在多个列表的话也是支持动态加载的,而不是会一次性全部渲染完 各式各样的 Slivers 组件 SliverList 在上面的例子中 SliverList 使用的是 SliverChildBuilderDelegate...这个delegate,它可以实现动态加载,当然 SliverList 中也有和 ListView 中一样的非动态加载的delegate,就是SliverChildListDelegate SliverList
这篇文章将介绍一下它们的作用和使用场景。...,将在后续加入到开源项目 FlutterUnit 中,欢迎大家对项目的关注和支持 ~ ---- 2....具体使用场景是: 比如下面是 QQ 中分组列表滑动效果,组名下有若干成员,组的标题在滑动中会进行吸附,而且在滑动到下一组标题时,上一标题会被滑出;同样,下滑时展现也是如此。...如下所示,左中右三块 SliverList 水平排布,共同滑动。...解决的场景是: 在交叉轴方向,需要摆放若干个滑块时,这些滑块可以共同滚动。 ---- 4.
在 Viewport 里产生滑动; 黄色的部分就是 SliverList , 当我们滑动时其实就是它在 Viewport 里的位置发生了变化; 了解完这个基础理念后,就可以知道一般情况下 Viewport...RenderBox 在 SingleChildScrollView 内部使用的是 RenderBox ,那么在布局过程中自然而然会把整个 child 都进行布局和计算,绘制时主要也是通过 offset...和 clip 等来完成移动效果,这样的实现当 child 比较复杂或者过长时,性能就会变差。...而不是多个,想使用多个 RenderSliver 需要使用 CustomScrollView 。...最后顺便聊下 CustomScrollView ,事实上就是一个开放了可自定义配置 RenderSliver 数组的滑动控件,例如: 通过利用 SliverList + SliverGrid 就可以搭配出多样化的滑动列表
在 Viewport 里产生滑动; 黄色的部分就是 SliverList , 当我们滑动时其实就是它在 Viewport 里的位置发生了变化; 了解完这个基础理念后,就可以知道一般情况下 Viewport...RenderBox 在 SingleChildScrollView 内部使用的是 RenderBox ,那么在布局过程中自然而然会把整个 child 都进行布局和计算,绘制时主要也是通过 offset ...和 clip 等来完成移动效果,这样的实现当 「child 比较复杂或者过长时,性能就会变差」。... 而不是多个」,想使用多个 RenderSliver 需要使用 CustomScrollView。...最后顺便聊下 CustomScrollView ,事实上就是一个「开放了可自定义配置 RenderSliver 数组的滑动控件」,例如: 通过利用 SliverList + SliverGrid 就可以搭配出多样化的滑动列表
如下效果: 在上滑时Tap栏会逐渐变矮,直到最小值。下拉到顶时变矮的Tap栏会逐渐变高,直到最大值 FlutterUnit本身主页比较复杂,本文就来写一个最简实践,用最少的代码来实现这个效果。...CustomScrollView,其中slivers接收Sliver家族组件的列表。...CustomScrollView不是本文的主人公,这里不多说,以后会有专篇。...如下: _buildSliverList负责构建SliverList,其中颜色的item组件的构建交由_buildColorItem 。...上滑: 顶部会滑出 上滑:顶部会滑出 下拉:直到滑到顶端时,顶部才会展开 下拉: 任意位置下拉时, 空间会展开 ---- 三、使用 SliverPersistentHeader 1.
CalendarList滚动列表绘制 通过上面的讲述,我们了解了如何使用CalendarList组件,那么我们看看源码里面具体做了哪些。...笔者在实现该功能时把MonthView作为SliverList的一个build item。...放置到CustomScrollView的Sliver里面,这里复习一下,Sliver的作用其实就是“粘合剂”的作用,把多个组件粘合起来形成一个滚动区域,布局如下: CustomScrollView(...slivers: [ SliverList( delegate: SliverChildBuilderDelegate( (BuildContext...总结一下,通过本例可以学习到以下知识点 路由参数传递和参数回传 父子组件正向与逆向通信 日期函数DateTime的运用 Sliver在CustomScrollView中的运用 日历绘制方式 底部弹出组件使用方式
你如果需要在两个方向上收缩包装(在滚动轴和横轴)例如 dialog或者 pop-up菜单,在这种情况下,你可以用SingleChildScrollView包裹孩子ListBody。...CustomScrollView CustomScrollView是可以使用Sliver来自定义滚动模型(效果)的组件。...如果使用GridView+ListView来实现的话,就不能保证一致的滑动效果,因为它们的滚动效果是分离的,所以这时就需要一个”胶水”,把这些彼此独立的可滚动组件”粘”起来,而CustomScrollView...因此,为了能让可滚动组件能和CustomScrollView配合使用,Flutter提供了一些可滚动组件的Sliver版,如SliverList、SliverGrid等。...实际上Sliver版的可滚动组件和非Sliver版的可滚动组件最大的区别就是前者不包含滚动模型(自身不能再滚动),而后者包含滚动模型 ,也正因如此,CustomScrollView才可以将多个Sliver
领取专属 10元无门槛券
手把手带您无忧上云