#####简单样式
1 | import 'package:flutter/material.dart'; |
#####TextStyle
1 | new Text( |
#####softWrap
是否自动换行,若为false,文字将不考虑容器大小,单行显示,超出屏幕部分将默认截断处理
#####overflow
当文字超出屏幕的时候,如何处理:
- TextOverflow.clip(裁剪)
- TextOverflow.fade(渐隐)
- TextOverflow.ellipsis(省略号)
#####简单样式
1 | import 'package:flutter/material.dart'; |
#####TextStyle
1 | new Text( |
#####softWrap
是否自动换行,若为false,文字将不考虑容器大小,单行显示,超出屏幕部分将默认截断处理
#####overflow
当文字超出屏幕的时候,如何处理:
Card 摘要:
1 | class _home extends StatefulWidget { |
#####固定的垂直布局
1 | class _home extends StatefulWidget { |
#####横向滑动的listview
1 | class _home extends StatefulWidget { |
#####简单demo无限滚动的listview
1 | //pubspec.yaml 中添加包 english_words: ^3.1.0 |
1 |
|
######另一种写法:
1 | class _home extends StatefulWidget { |
######效果一样
垂直布局时:y轴为主轴,x轴为副轴!
水平不就是:x轴为主轴,y轴为副轴!
Material widgets库中提供了Material风格的单选开关Switch和复选框Checkbox,它们都是继承自StatelessWidget,所以它们本身不会保存当前选择状态,所以一般都是在父widget中管理选中状态。当用户点击Switch或Checkbox时,它们会触发onChanged回调,我们可以在此回调中处理选中状态改变逻辑。我们看一个简单的示例:
1 | class _home extends StatefulWidget { |
上面代码中,由于要维护Switch和Checkbox状态,所以SwitchAndCheckBoxTestRoute继承自StatefulWidget 。在其build方法中分别构建了一个Switch和Checkbox,初始状态都为选中状态,当用户点击时,会将状态置反,然后回调用setState()通知framework重新构建UI。
它们都有一个activeColor属性,用于设置激活态的颜色。至于大小,到目前为止,Checkbox的大小是固定的,无法自定义,而Switch只能定义宽度,高度也是固定的。值得一提的是Checkbox有一个属性tristate ,表示是否为三态,其默认值为false ,这时Checkbox有两种状态即“选中”和“不选中”,对应的value值为true和false ;如果其值为true时,value的值会增加一个状态null,读者可以自行了解。
#####图片
Flutter中,我们可以通过Image来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。
#####ImageProvider
ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。
#####Image
Image widget有一个必选的image参数,它对应一个ImageProvider。下面我们分别演示一下如何从asset和网络加载图片。
#####从asset中加载图片
在工程根目录下创建一个assets目录再在assets中创建images目录,并将图片拷贝到该目录。
在pubspec.yml中的flutter部分添加如下内容:
1 | assets: |
加载该图片
1 | Image.asset("assets/images/dubai.jpg",width: 300,),//width宽度 可以不设置 |
#####从网络加载图片
1 | Image.network("https://www.baidu.com/img/bd_logo1.png"), |
//参数
1 | Image.asset( |
#####层叠布局
层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子widget可以根据到父容器四个角的位置来确定本身的位置。绝对定位允许子widget堆叠(按照代码中声明的顺序)。Flutter中使用Stack和Positioned来实现绝对定位,Stack允许子widget堆叠,而Positioned可以给子widget定位(根据Stack的四个角)。
#####Stack
1 | Stack({ |
#####Positioned
1 | const Positioned({ |
left、top 、right、 bottom分别代表离Stack左、上、右、底四边的距离。width和height用于指定定位元素的宽度和高度,注意,此处的width、height 和其它地方的意义稍微有点区别,此处用于配合left、top 、right、 bottom来定位widget,举个例子,在水平方向时,你只能指定left、right、width三个属性中的两个,如指定left和width后,right会自动算出(left+width),如果同时指定三个属性则会报错,垂直方向同理。
#####示例
1 | class _home extends StatefulWidget{ |
由于第一个子widget Text(“Hello world”)没有指定定位,并且alignment值为Alignment.center,所以,它会居中显示。第二个子widget Text(“I am Jack”)只指定了水平方向的定位(left),所以属于部分定位,即垂直方向上没有定位,那么它在垂直方向对齐方式则会按照alignment指定的对齐方式对齐,即垂直方向居中。对于第三个子widget Text(“Your friend”),和第二个Text原理一样,只不过是水平方向没有定位,则水平方向居中。
我们给上例中的Stack指定一个fit属性,然后将三个子widget的顺序调整一下:
1 | class _home extends StatefulWidget{ |
#####导航返回拦截WillPopScope
为了避免用户误触返回按钮而导致APP退出,在很多APP中都拦截了用户点击返回键的按钮,当用户在某一个时间段内点击两次时,才会认为用户是要退出(而非误触)。Flutter中可以通过WillPopScope来实现返回按钮拦截,我们看看WillPopScope的默认构造函数:
1 | const WillPopScope({ |
onWillPop是一个回调函数,当用户点击返回按钮时调用(包括导航返回按钮及Android物理返回按钮),该回调需要返回一个Future对象,如果返回的Future最终值为false时,则当前路由不出栈(不会返回),最终值为true时,当前路由出栈退出。我们需要提供这个回调来决定是否退出。
#####示例
为了防止用户误触返回键退出,我们拦截返回事件,当用户在1秒内点击两次返回按钮时,则退出,如果间隔超过1秒则不退出,并重新记时。代码如下:
1 | import 'package:flutter/material.dart'; |
#####弹性布局
弹性布局允许子widget按照一定比例来分配父容器空间,弹性布局的概念在其UI系统中也都存在,如H5中的弹性盒子布局,Android中的FlexboxLayout。Flutter中的弹性布局主要通过Flex和Expanded来配合实现。
#####Flex
Flex可以沿着水平或垂直方向排列子widget,如果你知道主轴方向,使用Row或Column会方便一些,因为Row和Column都继承自Flex,参数基本相同,所以能使用Flex的地方一定可以使用Row或Column。Flex本身功能是很强大的,它也可以和Expanded配合实现弹性布局,接下来我们只讨论Flex和弹性布局相关的属性(其它属性已经在介绍Row和Column时介绍过了)。
1 | Flex({ |
Flex继承自MultiChildRenderObjectWidget,对应的RenderObject为RenderFlex,RenderFlex中实现了其布局算法。
#####Expanded
可以按比例“扩伸”Row、Column和Flex子widget所占用的空间。
1 | const Expanded({ |
flex为弹性系数,如果为0或null,则child是没有弹性的,即不会被扩伸占用的空间。如果大于0,所有的Expanded按照其flex的比例来分割主轴的全部空闲空间。下面我们看一个例子:
1 | class _home extends StatefulWidget{ |