粘性滑动Sliver、widget矩阵变化、导航返回拦截
CustomScrollView
CuStomScrollView是可以使用sliver来自定义滑动模型的wideget,比如说一个页面中,有一个list View和一个GridView,那么我们如何让他们的滑动连接到一起呢?如果不连接到一起,那么他们肯定是自己滑动自己的,没有一个统一的滑动,CustomScrollView的作用就是将这两个滑动widget组合到一起的
Sliver,这个东西在flutter中通常是指可滑动的widget块,我们上面提到的listview和gridView都有对应的sliver,比如sliverList,sliverGrid,而sliver滑动块是不具备滑动效果的,我们追述源码可以看到他不想listview之类的继承了scrollView,我们可以理解成sliverList就是去掉了滑动的ListView,正因为没有滑动效果,CustomScrollView才能去组合他们。
Tranform
Tranform可以使子widget在绘制的时候进行矩阵变换,比如常见的旋转、缩放、平移,但是要分清楚这个不是动画,只是将其位置大小进行改变,也可以根据自己的需求去自定义矩阵
Transform.translate:平移,以左上角为起点,进行偏移
DecoratedBox(
decoration:BoxDecoration(color: Colors.red),
//默认原点为左上角,左移20像素,向上平移5像素
child: Transform.translate(
offset: Offset(-20.0, -5.0),
child: Text("Hello world"),
),
)
Transform.rotate:旋转,以widget为中心,以下为选择90度例子;同样可以达到选择的widget还有RotatedBox
DecoratedBox(
decoration:BoxDecoration(color: Colors.red),
child: Transform.rotate(
//旋转90度
angle:math.pi/2 ,
child: Text("Hello world"),
),
);
Transform.scale:缩放,将widget进行缩放
DecoratedBox(
decoration:BoxDecoration(color: Colors.red),
child: Transform.scale(
scale: 1.5, //放大到1.5倍
child: Text("Hello world")
)
)
导航返回拦截-android中连续点击两次退出
Android中我们经常去拦截返回事件来判断是否两秒内是否退出应用的操作,在flutter中提供了WillPopScope来拦截返回操作,在onWillPop回调中进行业务逻辑操作
class WillPopScopeTestRouteState extends State<WillPopScopeTestRoute> {
DateTime _lastPressedAt; //上次点击时间
@override
Widget build(BuildContext context) {
return new WillPopScope(
onWillPop: () async {
if (_lastPressedAt == null ||
DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)) {
//两次点击间隔超过1秒则重新计时
_lastPressedAt = DateTime.now();
return false;
}
return true;
},
child: Container(
alignment: Alignment.center,
child: Text("1秒内连续按两次返回键退出"),
)
);
}
}