1、SafeArea
智能设备更新快,应用只适配规整的矩形界面已不可行,如下图:
![](https://img.haomeiwen.com/i9726877/f42c84134000ac18.png)
消息提示栏总是不断闪出,全屏手机屏幕的圆角或者凹口屏“侵蚀”着内容,也会让应用的布局变得更复杂,这就是Flutter为什么内置了SafeArea这个widget,它使用MediaQuery来检测屏幕的尺寸,使应用的大小能与平面匹配。如果没有用SafeArea,有可能你的界面会是这样的:
![](https://img.haomeiwen.com/i9726877/c2e405985a4b996f.png)
用了SafeArea是这样的:
SafeArea(child:ListView(
children:List.generate(100, (i)=>Text('This text is unobscured!'))
))
![](https://img.haomeiwen.com/i9726877/aa7b86ae8d1da62d.png)
SafeArea中你甚至可以指定特定的现实区域
![](https://img.haomeiwen.com/i9726877/10dd4968bc028435.png)
与Scaffold来配合使用就能起到很好的效果
![](https://img.haomeiwen.com/i9726877/5d8de8043d73e66c.png)
2、Expanded
几乎每个Flutter布局都使用行和列,它们即可以让自己的子项紧凑的排列在一起,也可以让它们松散的平铺。
![](https://img.haomeiwen.com/i9726877/644bcd88bb149ea7.png)
![](https://img.haomeiwen.com/i9726877/8bccc1726b1847d8.png)
那么如何让其中一个子项拉伸并填充余下的空间呢?只需要将该子项包裹在Expanded中即可。、
![](https://img.haomeiwen.com/i9726877/caae50ae5fa35c3c.png)
![](https://img.haomeiwen.com/i9726877/50e14db9bf67cdfb.png)
当行或者列布置其子项时,它首先执行不灵活的子项,然后它将剩余空间划分给灵活的子项,如Expanded。你甚至可以设置一个flex参数以防竞争。
Expanded(flex:2, child:Container())
![](https://img.haomeiwen.com/i9726877/4f34f0ebd9cc4036.png)
3、Wrap
行和列很适合用来布局widgets,但有时你可能没有足够的空间。如下图:
![](https://img.haomeiwen.com/i9726877/91b7907fcf3f3db7.png)
Wrap是一个解决此问题的widget,Wrap为单个的图标逐一进行布局,很类似行或者列,但当空间不足的时候,便会新增一行,你可以使用direction属性,来让Wrap以垂直或者水平的方式运行,如下图代码
![](https://img.haomeiwen.com/i9726877/46dc8b6d9327829b.png)
![](https://img.haomeiwen.com/i9726877/d58ff63b0a5b723c.png)
Wrap适合按钮布局或者小图标布局。
4、AnimatedContainer
Flutter有很多用于显式控制动画的widgets,这些动画需要有开发者实现,但是也有些widget可以用于控制隐式的动画效果,其中不错的一个widget便是AnimatedContainer,首先你可以用某个特定的属性,例如颜色来渲染它,然后当你使用一个不同的色值重新渲染它时,如通过调用setState,AnimatedContainer会在两个值之间做一个线性插值运算。
![](https://img.haomeiwen.com/i9726877/9b67bdbc0793e696.png)
![](https://img.haomeiwen.com/i9726877/198c18c6326f98e0.png)
可以指定动画曲线来实现个性化效果
![](https://img.haomeiwen.com/i9726877/2f6a2ce4bedb37c6.png)
5、Opacity
在flutter中,很容易就能完全移除一个widget,你只要在重新渲染时移除它即可,但你如果想要让一个widget消失而它原来占据的空间仍然被保留呢,这样其他的图标就能留在它们原来的位置上,就像iOS中的hidden和Android中的invisible做的那样,试试Opacity这个widget,只要使用Opacity来封装你的widget,然后将数值设置为0就ok了。
![](https://img.haomeiwen.com/i9726877/df750224e39a2cfe.png)
也可以用Opacity将栈视图的不同子视图混合到一起
![](https://img.haomeiwen.com/i9726877/8976c2b26fb7943e.png)
![](https://img.haomeiwen.com/i9726877/3084f3b7d11ea463.png)
如果你想为Opacity更改增加动画,可以使用AnimatedOpacity的widget,只要你给Opacity添加一个时长,然后当你重新渲染的时,它就会自动为你更改创建动画效果。
![](https://img.haomeiwen.com/i9726877/73e58312bc62ce36.png)
![](https://img.haomeiwen.com/i9726877/e6efb27612eaf799.png)
6、FutureBuilder
Flutter和Dart天生就是异步的,使用Dart的Furtures你可以管理IO,而无需担心线程或死锁,但是当涉及到future对象时,你应该如何构建widget,可以使用来自未来的FutureBuilder,它要处理的刚好也是“未来(Future)”,FutureBuilder让你轻松确定futrue对象当前的状态,并选择在数据加载时显示的内容以及在可用时显示的内容,首先给FutureBuilder传递一个future对象和一个builder,但请确保使connectionState检查这个future对象的状态,如下图所示:
![](https://img.haomeiwen.com/i9726877/c3b1cac7bf719afc.png)
最后,最好在future对象运行时,确保没有错误发生
![](https://img.haomeiwen.com/i9726877/fe88799a38ad7264.png)
![](https://img.haomeiwen.com/i9726877/095dab669a981b4c.png)
7、FadeTransition
Flutter有很多的转场可加入你的Flutter应用,FadeTransition允许你淡入淡出一个widget,它需要一个子项和一个动画,但是动画从何而来呢,首先我们创建一个AnimationController以设置持续时间,然后我们创建一个animation并给定始末的opacity值,如下图:
![](https://img.haomeiwen.com/i9726877/45ff633f2547dcda.png)
并通过controlller创建动画,最后通过调用controller的forward()方法来启动画面,将FadeTransition封装在StatefulWidget中是个好主意,这样你就可以管理其他状态并在完成后进行清理
![](https://img.haomeiwen.com/i9726877/752d08736cd18b61.png)
![](https://img.haomeiwen.com/i9726877/c897e19ca946ede2.png)
![](https://img.haomeiwen.com/i9726877/07c4827a0e52d4ab.png)
8、FloatingActionButton(FAB)
在Flutter中添加FloatingActionButton非常容易,只需要将FAB添加到scaffold中即可,但是如果你有一个BottomNavigationBar,并且想要将FAB嵌入其中,Flutter里可以这样做:首先,将BottomNavigationBar添加到Scaffold widget里,然后使用FloatingActionButtonLocation嵌入FAB中
![](https://img.haomeiwen.com/i9726877/94172f8e186644ee.png)
![](https://img.haomeiwen.com/i9726877/81fe7078a8aa0945.png)
网友评论