作为系列文章的第十八篇,本篇将通过 ScrollPhysics 和 Simulation ,带你深入走进 Flutter 的滑动新世界,为你打开 Flutter 滑动操作的另一扇窗。...一、前言 如下图所示,Flutter 默认的可滑动 Widget,在 Android 和 iOS 上具备不同的 滑动与边缘拖拽效果 ,这是因为在不同平台上,默认使用了不同的 ScrollPhysics...二、 ScrollPhysics 首先介绍 ScrollPhysics ,在 Flutter 官方的介绍中,ScrollPhysics 的作用是 确定可滚动控件的物理特性, 常见的有以下四大金刚: BouncingScrollPhysics...三、ScrollPhysics 工作原理 那么 ScrollPhysics 是怎么实现滚动和边缘拖拽的呢?...最后 到这里 Flutter 的 ScrollPhysics 和 Simulation 就基本分析完了,严格意义上, Simulation 应该是属于动画的部分,但是这里因为ScrollPhysics
当滑动方向为垂直方向(scrollDirection值为Axis.vertical)并且controller没有指定时,primary默认为true physics:此属性接受一个ScrollPhysics...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如当滑动到边界时,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...如果你想在所有平台下使用同一种效果,可以显式指定,Flutter SDK中包含了两个ScrollPhysics的子类可以直接使用: ClampingScrollPhysics→Android下微光效果...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如当滑动到边界时,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...如果你想在所有平台下使用同一种效果,可以显式指定,Flutter SDK中包含了两个ScrollPhysics的子类可以直接使用: ClampingScrollPhysics→Android下微光效果
获取到 _ScrollableScope 就可以获取到它内部的 ScrollPosition , 进而它的 ScrollPhysics 对应的 recommendDeferredLoading 方法,判断列表是否处于快速滑动状态...所以判断是否快速滑动的逻辑其实是在 ScrollPhysics。...maxPhysicalPixels; } return parent.recommendDeferredLoading(velocity, metrics, context); } 关于 ScrollPhysics...的解释可以看 《十八、 神奇的ScrollPhysics与Simulation》 然后回到 resolveStreamForKey 方法,可以看到当 Scrollable.recommendDeferredLoadingForContext
---- 滚动时的物理效果 ScrollPhysics 这些滚动组件的物理滚动效果都是通过ScrollPhysics来进行配置的。 Flutter自带的 自动的ScrollPhysics就有4个。...final ScrollPhysics physics = _scrollController.position.pixels >= midScrollOffset ?...(() { _headingScrollPhysics = physics; }); } } return false; } 自定义ScrollPhysics...我们这里,通过自定义ScrollPhysics 返回对应的SpringSimulation就满足我们的效果了。...用于区分 final double midScrollOffset; @override _SnappingScrollPhysics applyTo(ScrollPhysics ancestor
2)再来看下ScrollPhysics这个重要的类,它主要决定了滑动位置处于一些边界场景情况下,对于用户的滑动应该怎么去反馈。...这时候PageView对应的ScrollPhysics就会再给一个自动的矫正滑动,让我们的页面滑动到对应的整页。 ScrollPhysics在SDK中已经提供了好几种实现。...这些不同类型的ScrollPhysics是可以组合使用的,ScrollPhysics本身的设计也考虑到了这点。...在构造一个ScrollPhysics时,我们可以传入一个默认的ScrollPhysics,也就是说新的ScrollPhysics默认就会组合传入的ScrollPhysics特性。...总的来说ScrollPhysics还是非常重要的,它承担用户在scrollable上滑动各种特殊场景的效果逻辑。
scrollDirection: Axis.vertical,//滚动方向 bool reverse: false,//十分反向显示数据 ScrollController controller, bool primary, ScrollPhysics...Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics...Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics
DragStartBehavior.start, this.enableInteractiveSelection, this.onTap, this.buildCounter, this.scrollPhysics
this.physics, @required this.viewportBuilder, //后面介绍 }) 复制代码 axisDirection:滚动方向 physics:此属性接受一个 ScrollPhysics...默认情况下,Flutter 会根据具体的平台分别使用不同的 ScrollPhysics 对象,应用不同的显示效果,在 IOS 上会出现弹性效果,而在 android 上则会出现微光效果,如果你想在所有的平台下使用同一个效果...,可以显式的指定一个固定的 ScrollPhysics 。...Flutter SDK 中包含了两个 ScrollPhysics 的子类,他们可以直接使用 ClampingScrollPhysics:Android 下微光效果 BouncingScrollPhysics...scrollDirection = Axis.vertical, bool reverse = false, ScrollController controller, bool primary, ScrollPhysics
是上下都有弹性效果) 重写applyBoundaryConditions方法 ///base on BouncingScrollPhysics /// class ChatScrollPhysics extends ScrollPhysics
) 重写applyBoundaryConditions方法 ///base on BouncingScrollPhysics /// class ChatScrollPhysics extends ScrollPhysics
scrollController.animateTo(20.0); CustomScrollView( controller: _scrollController, ... ) physics表示可滚动组件的物理滚动特性,系统提供的ScrollPhysics
false, ///滑动控制器 ScrollController controller, ///是否使用默认的控制器 bool primary, ///滑动到边界时的回弹效果 ScrollPhysics
primary, ScrollPhysics? physics, bool shrinkWrap = false, EdgeInsetsGeometry?
midScrollOffset) { if (notification.depth == 0 && notification is ScrollUpdateNotification) { final ScrollPhysics...simulation class _SnappingScrollPhysics extends ClampingScrollPhysics { const _SnappingScrollPhysics({ ScrollPhysics...super(parent: parent); final double midScrollOffset; @override _SnappingScrollPhysics applyTo(ScrollPhysics
physics → ScrollPhysics – 页面视图如何响应用户输入,即滚动的动画表现。 reverse → bool – 是否反方向。
AxisDirection.down,//滚动方向 this.controller,//用于接收一个ScrollController对象,控制滚动位置和监听滚动事件 this.physics,//用于接收一个ScrollPhysics...ScrollController controller,//控制滚动位置,当primary为true时,controller必须为null bool primary,//是否是与父级关联的主滚动视图 ScrollPhysics...scrollDirection = Axis.vertical, bool reverse = false, ScrollController controller, bool primary, ScrollPhysics...scrollDirection = Axis.vertical, bool reverse = false, ScrollController controller, bool primary, ScrollPhysics
: EdgeInsets.symmetric(horizontal: 12.0), child: GridView.builder( physics: ScrollPhysics
scrollController.animateTo(20.0); CustomScrollView( controller: _scrollController, ... ) physics表示可滚动组件的物理滚动特性,具体查看ScrollPhysics
onItemClick, ScrollPhysics?...onItemClick, ScrollPhysics?
领取专属 10元无门槛券
手把手带您无忧上云