组件flutter,组件英文

Flutter了解之可滑动组件

Flutter官方并没有对Widget进行官方分类,对其分类主要是为了对Widget进行功能区分。

成都创新互联公司长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为坡头企业提供专业的网站建设、网站设计,坡头网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

当组件内容超过当前显示窗口时,如果没有特殊处理,Flutter则会提示Overflow错误。为此,Flutter提供了多种可滚动组件用于显示列表和长布局。

在可滚动组件的坐标描述中,通常将滚动方向称为主轴,非滚动方向称为纵轴。由于可滚动组件的默认方向一般都是沿垂直方向,所以默认情况下主轴就是指垂直方向,水平方向同理。

通常可滚动组件的子组件可能会非常多、占用的总高度也会非常大;如果要一次性将子组件全部构建出将会非常昂贵!为此,Flutter中提出一个Sliver(中文为“薄片”的意思)概念,如果一个可滚动组件支持Sliver模型,那么该滚动可以将子组件分成好多个“薄片”(Sliver),只有当Sliver出现在视口中时才会去构建它,这种模型也称为“基于Sliver的延迟构建模型”。

可滚动组件中有很多都支持基于Sliver的延迟构建模型,如ListView、GridView,但是也有不支持该模型的,如SingleChildScrollView。

在很多布局系统中都有ViewPort的概念,在Flutter中,术语ViewPort(视口),如无特别说明,则是指一个Widget的实际显示区域。例如: 一个ListView的显示区域高度是800像素,虽然其列表项总高度可能远远超过800像素,但是其ViewPort仍然是800像素。

可滚动组件都直接或间接包含一个Scrollable组件

如果要给可滚动组件添加滚动条,只需将Scrollbar作为可滚动组件的任意一个父级组件。

沿一个方向线性排布所有子组件。支持基于Sliver的延迟构建模型。

ListView高度边界无法确定时会异常。

默认构造函数有一个children参数,它接受一个Widget列表。

实际上通过此方式创建的ListView和使用SingleChildScrollView+Column的方式没有本质的区别。

适合只有少量的子组件的情况,因为这种方式需要将所有children都提前创建好(这需要做大量工作),而不是等到子widget真正显示的时候再创建,也就是说通过默认构造函数构建的ListView没有应用基于Sliver的懒加载模型。

例(水平滚动)

适合列表项比较多(或者无限)的情况,因为只有当子组件真正显示的时候才会被创建,也就说通过该构造函数创建的ListView是支持基于Sliver的懒加载模型的。

例(不同类型的item)

ListView.separated可以在生成的列表项之间添加一个分割组件,它比ListView.builder多了一个separatorBuilder参数,该参数是一个分割组件生成器。

类似于Android中的ScrollView,它只能接收一个子组件。

通常内容不会超过屏幕太多时使用SingleChildScrollView,这是因为它不支持基于Sliver的延迟实例化模型,所以如果预计视口可能包含超出屏幕尺寸太多的内容时,那么使用SingleChildScrollView将会非常昂贵(性能差),此时应该使用一些支持Sliver延迟加载的可滚动组件,如ListView。

例(将大写字母A-Z沿垂直方向显示)

一个二维网格列表

GridView和ListView的大多数参数都是相同的。

横轴为固定数量子元素。

GridView.count构造函数内部使用了SliverGridDelegateWithFixedCrossAxisCount。

例(GridView.count)

该子类实现了一个横轴子元素为固定最大长度的layout算法

当子widget比较多时,可以通过GridView.builder来动态创建子widget。

GridView.builder 必须指定的参数有两个,其中itemBuilder为子widget构建器。

举个例子,假设有一个页面,顶部需要一个GridView,底部需要一个ListView,而要求整个页面的滑动效果是统一的,即它们看起来是一个整体。如果使用GridView+ListView来实现的话,就不能保证一致的滑动效果,因为它们的滚动效果是分离的。

所以这时就需要一个"胶水",把这些彼此独立的可滚动组件"粘"起来,而CustomScrollView的功能就相当于“胶水”。

Sliver有细片、薄片之意,在Flutter中Sliver通常指可滚动组件子元素。在CustomScrollView中,需要粘起来的可滚动组件就是CustomScrollView的Sliver了,如果直接将ListView、GridView作为CustomScrollView是不行的,因为它们本身是可滚动组件而并不是Sliver。

因此,为了能让可滚动组件能和CustomScrollView配合使用,Flutter提供了一些可滚动组件的Sliver版,如SliverList、SliverGrid等。

实际上Sliver版的可滚动组件和非Sliver版的可滚动组件最大的区别就是前者不包含滚动模型(自身不能再滚动),而后者包含滚动模型 ,也正因如此,CustomScrollView才可以将多个Sliver"粘"在一起,这些Sliver共用CustomScrollView的Scrollable,所以最终才实现了统一的滑动效果。

例(SliverList)

例(SliverGrid)

可以用ScrollController来控制可滚动组件的滚动位置

滚动位置恢复

ScrollPosition

ScrollController控制原理

滚动监听

Flutter自定义绘制组件

Flutter中自定义组件一般有两种方式:

CustomPaint继承自SingleChildRenderObjectWidget,即它可以在通过嵌套引入到widget树中,并且可以有一个child子widget。它的构造方法如下:

painter和foregroundPainter需要接收CustomPainter对象,是CustomPaint核心。CustomPainter是进行UI绘制的核心类,绘制时, CustomPaint 首先在画布上调用 painter绘制 , 然后再绘制它的 child Widget, child 绘制完成后再调用 foregroundPainter 进行绘制。

size属性标识绘制区域大小,但当CustomPaint有child,该属性将会忽略,而使用child的大小为绘制区域大小。

isComplex和willChange用于控制绘制层缓存处理的,这里暂不讨论。

可实现CustomPainter子类进行UI绘制

实现paint方法进行真正的绘制,canvas是画布对象,size是绘制区域,是从CustomPaint中size属性传递得到的。绘制过程与Android原生开发十分类似,连API都十分相像,这点对熟悉Android原生开发者真是太友好了。

Paint对象是画笔对象,就是绘图工具,我们可以设置画笔的颜色、粗细、是否抗锯齿、笔触形状以及作画风格等,通过这些属性我们可以很方便的来定制自己的UI效果,在绘制的过程中可以定义多个画笔,以便实现多种风格图形的集合。

根据需求选择合适的画笔属性,完成你的绘制。

Canvas是绘制的画布,它包含了很多绘制方法,可以绘制出各种形状的图形。需要注意的是,画布是应用所有控件都在使用的, 所以通过这个画布其实是可以绘制充满屏幕的内容的,每次绘制都应该限制在本控件的区域(Size)内, 以免绘制覆盖到其他组件。

下面介绍下Canvas的绘制方法:

PointMode是个枚举

p1、p2为线段两个端点

Rect定义矩形的大小位置,有多种构造方式:

RRect描述圆角矩形,他通过Rect和Radius来构造

画圆比较简单,c表示圆心位置,radius是半径。

椭圆使用外接矩形确定大小位置,rect就是外接矩形。

绘制弧形,先确定弧形对应的椭圆,同样地用外接矩形rect确定椭圆,然后根据起始点和结束点角度来确定那一段弧度,startAngle,sweepAngle分别代表起始和结束点角度,角度用弧度表示法。

useCenter表示是否连接闭合形状,userCenter = false表示不闭合,即画一段弧线,userCenter = true表示闭合,即绘制一个扇形。

绘制路径,关键在于构建路径Path,可以直接new Path对象,然后通过path方法可以连接出图形,path关键方法如下:

还有其他方法,有兴趣可以查看API。

Flutter 组件样式

在 Flutter 中的组件样式,都是通过组件上的 style 属性进行设置的,这与 React Native 很类似。

例如,在 Text 组件里设置样式。

与 React Native 不同的是,有一些样式不不能在 style 里面设置的。例如 width,height,color 等属性。因为 Flutter 认为这样应该是组件的属性而不是样式。

边距只要是 padding(内边距) 和 margin(外边距)两个设置。边距只适用于 Container。

如果要使用绝对定位,那么需要把内容包裹在 Positioned 容器里,而 Positioned 又需要包裹在 Stack 容器里。

容器的边框设置,使用 Border 对象。边框只适用于 Container。

要设置容器的圆角,使用 BorderRadius 对象,它只能使用于 Container。

BorderRadius 有以下的属性与方法。

在 Flutter 里设置阴影效果,需要使用 BoxShadow 对象。阴影效果只适用于 Container。

等效于 css 上的阴影效果设置。

Flutter圆角设置组件

flutter能设置圆角的组件:ClipRRect、ClipOval、CircleAvatar、BoxDecoration BorderRadius.circular、BoxDecoration BoxShape.circle

1.ClipRRect:将 child 剪裁为宽高相等的圆角组件,可设置圆角度数

2.ClipOval: 将child裁剪为宽高相等的圆角组件(只包括圆形和椭圆形),不可设置圆角度数

3.CircleAvatar:只能设置自身圆形,不能裁剪child

4.BoxDecoration BorderRadius.circular 设置自身圆角,不能裁剪child

4.BoxDecoration BoxShape.circle 只能设置自身为圆形,不能裁剪child

参考: flutter 圆角设置

Flutter(6):基础组件之Image

Image是一个用于展示图片的组件。支持 JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP 和 WBMP 等格式。

Image.asset - 用于从资源目录的显示图片,需要在 pubspec.yaml 文件中声明。

Image.network - 用于从网络上显示图片。

Image.file - 用于从文件里显示图片。

Image.memory - 用于从内存里(Uint8List)显示图片。

alignment → AlignmentGeometry - 图像边界内对齐图像。

centerSlice → Rect - 九片图像的中心切片。

color → Color - 该颜色与每个图像像素混合colorBlendMode。

colorBlendMode → BlendMode - 用于 color 与此图像结合使用。

fit → BoxFit - 图像在布局中分配的空间。

gaplessPlayback → bool - 当图像提供者发生变化时,是继续显示旧图像(true)还是暂时不显示(false)。

image → ImageProvider - 要显示的图像。

matchTextDirection → bool - 是否在图像的方向上绘制图像 TextDirection。

repeat → ImageRepeat - 未充分容器时,是否重复图片。

height → double - 图像的高度。

width → double - 图像的宽度。

加载资源图片需要将图片资源放入工程中,例如:新建images文件夹,将图片放在该文件夹下,图片适配则是使用ios的方式1X,2X,3X:

然后在pubspec.yaml中配置assets:

加载资源/网络/本地文件图片/内存图片:

占位图加载图片:

圆形图片:1.裁剪实现 2.CircleAvatar实现 3.Container边框实现

圆角图片:1.裁剪实现 2.Container边框实现

BoxFit.contain 全图居中显示但不充满,显示原比例

BoxFit.cover 图片可能拉伸,也可能裁剪,但是充满容器

BoxFit.fill 全图显示且填充满,图片可能会拉伸

BoxFit.fitHeight 图片可能拉伸,可能裁剪,高度充满

BoxFit.fitWidth 图片可能拉伸,可能裁剪,宽度充满

BoxFit.scaleDown 效果和contain差不多, 但是只能缩小图片,不能放大图片

下一节学习基础组件之Text


网页标题:组件flutter,组件英文
本文地址:http://pwwzsj.com/article/hooces.html