flutter详细讲解,简书 flutter

Flutter小部件之图片(Image)和图标(Icon)

在Flutter中,我们可以使用Image控件来显示图片,一般来讲我们的图片资源都来源于网络或者本地图片。

成都创新互联专注骨干网络服务器租用10多年,服务更有保障!服务器租用,四川电信科技城机房 成都服务器租用,成都服务器托管,骨干网络带宽,享受低延迟,高速访问。灵活、实现低成本的共享或公网数据中心高速带宽的专属高性能服务器。

Flutter中的Image也是类似。

我们先来看看Image的构造方法

下面我们来看看其常用的属性

可以看到,其常用属性跟前端中的css很像。

下面我们来简单用一用Image控件

首先是必填参数image,它接收一个ImageProvider类型的值。ImageProvider是一个抽象类,他下面有下图这些实现类,由下面这些实现类可以看出,image是可以从资源,内存,网络,和文件中获取图片。

我们先来试试加载网络图片

首先看看NetworkImage构造方法,很简单,传个url就可以了

如下:

嗯,就是这么简单。其他3种情况使用也是类似的,自行看源码即可。

实际上,Flutter给我们提供了扩展方法,使用起来更加简单,通常我们直接使用提供的扩展方法即可

如下

可以看到,他们的构造方法基本类似。

所以我们也可以这样写,跟上面的效果是一致的。

大致分为一下几步

1.创建一个文件夹,用于存放图片,如图,我创建了一个imgs的文件夹,放了一张图片

2.在pubspec.yaml中声明资源,注意声明的时候路径和前面的-是有间隔的,不然的话会报#/properties/flutter/properties/assets: type: wanted [array] got -imgs/code.png

类似的错误,声明完成后点击右上方的packages get

下面我们再来看看其他属性。

width,height

宽高没什么好说的,就是设置宽度和高度

配合color使用,用于设置颜色的混合模式。BlendMode是一个枚举,他有很多值

详细解析还是看官方文档吧,值太多了,我们随便用用

用于设置图片的填充方式,当图片本身小于设置的宽高或者比父控件的宽高小时,我们可以设置该属性控制图片的显示。

其值的类型是BoxFit。是个枚举

具体含义还是直接看文档即可

设置图片的对齐方式,接收一个Alignment类型的值,值如下,很好理解

为了方便看效果我们在外边套了个Container,简单的把它理解为一个容器布局就可以了,类似于html中的div或android中的Layout,我们给Container设置了宽高和背景颜色。

bottomLeft效果如下,其他的自行尝试

相对于Image,ICON可以像web一样使用字体图标,并且可以使用矢量图,无需担心失真的问题,并且体积相对较小。

我们先来看看其构造方法

很简单,我们直接来用一用

默认情况下,pubspec.yaml中uses-material-design的值为true.我们默认就可以使用Material Design字体图标

详解flutter中本地资源图片的使用

一. flutter中我们想加载本地图片,需要两步:

二. flutter项目中本地图片加载的原理

在加载图片时,系统自动会根据屏幕分辨率优先选择到符合自己分配率的文件夹(2.0x或者3.0x或者4.0x)下去取相对应的图片,如果当前文件夹下没有,则会到低一倍的文件夹下去,如果还没有,则继续向更低一倍去取。(比如:iOS 5.5英寸及以上屏幕会优先选择去3.0x下去取图片,如果3.0x不存在或者3.0x文件夹下没有,则去2.0x下取;如果2.0x不存在或者2.0x下没有,则去1.0x下取;1.0x下再没有,则在images文件下取)。

Flutter开发--如何布局?

相对于iOS开发,Flutter的布局更具有灵活性,每个页面设计都不一样,相同页面可选择的布局方式也不一样,如果单纯的说应该如何去布局,我觉得不现实,大家可以参考下 Flutter官方的布局教程 。接下来,笔者,通过项目中的一个页面,来一步一步的拆解布局的流程。整个过程,基本上按照拆解、组件封装、具体布局这三步来的。

根据设计图,可以看出整体可以分成两部分,上面一部分是系统介绍模块,下面一部分是真正的登录内容,因为涉及到叠加,因此考虑用Stack;

系统介绍模块部分:整体也是涉及到叠加,考虑用Stack,分为四部分。最底部渐变色背景用一个contanier,无须指定位置,全视图扩展;载放logo图标在上一层,用Image。最后两个Text同级放在最上层。Image,Text各用Positioned包裹去指定位置。

登录内容模块是最外层是一个Contanier容器,去控制背景色和圆角。然后是一个Column元素,逐行排列。

第一行为Image,

第二行为Text,

第三行可以看成一个小Column,分两块进行布局

第四行可以看成一个小Column,分两块进行布局

第五行可以看作一个TextButton,

第六行可以看作一个Row,分三块进行布局

通过上面这样一步一步的分析后,基本上对大致的布局有了一个了解,最外层的控件大致选对(只要能实现的话,就是复杂度以及效率的问题),然后一步一步的拆解每一行的元素,如果有重复的或者觉得可以封装出来的部分,则进行下一步。

每一行的拆解,大致也是按照这个思路来进行,因此笔者在这里就不做讲解了。

在做到第三第四行的时候,发现这两个很相似,而且设计到一些交互逻辑,笔者就想对第三第四行的这种展示进行封装,觉得今后的布局可能会用到,因此在这一步,可以先把这一块儿抽离出一个控件。利用TextField来实现这种输入操作,具体的实现笔者不再详细的描述了。

经过这一步,整体的规划设计图已经有了,各个组件也都有了,接下来的工作就是组装了。

具体布局设计到一些细节的地方,例如整体Column的居中对齐(crossAxisAlignment)、间隔(Padding或Container包裹,笔者更喜欢用SizedBox占位)、居左居右居中(Align)、点击事件(GestureDetector)以及圆角(BorderRadius)等一些特殊情况。

像第六行row是放在底部的,就可以在第六行前面增加一个Spacer()去填充空白区域。

对文字颜色大小等,可以用TextStyle直接设置。

对于输入框的删除按钮,可以用Offstage这种Flutter特有的控制显示隐藏的控件。

Flutter TextField 文本输入框的基本属性及详解

源码分析:

分析源码可得,TextField 是有状态 StatefulWidget,有丰富的属性,自定义化较高,实践中需要合理利用各种回调;

1、光标的相关属性;cursorColor 为光标颜色,cursorWidth 为光标宽度,cursorRadius 为光标圆角;其中 Radius 提供了 circle 圆角和 elliptical 非圆角两种;

2、textAlign 为文字起始位置,可根据业务光标居左/居右/居中等;注意只是文字开始方向;textDirection 问文字内容方向,从左向右或从右向左;

3、maxLength 为字符长度,设置时默认是展示一行,且右下角有编辑长度与整体长度对比;与 maxLengthEnforced 配合,maxLengthEnforced 为 true 时达到最大字符长度后不可编辑;为 false 时可继续编辑展示有差别;

4、设置 maxLength 之后右下角默认有字符计数器,设置 TextField.noMaxLength 即可只展示输入字符数;

5、maxLines 为允许展现的最大行数,在使用 maxLength 时内容超过一行不会自动换行,因为默认 maxLines=1,此时设置为 null 或固定展示行数即可自动换行;区别在于 null 会展示多行,而 maxLines 最多只展示到设置行数;

6、obscureText 是否隐藏编辑内容,常见的密码格式;

7、enableInteractiveSelection 长按是否出现【剪切/复制/粘贴】菜单;不可为空;

8、keyboardAppearance 为键盘亮度,包括 Brightness.dark/light 两种,但仅限于 iOS 设备;

9、textCapitalization 文字大小写;理论上 sentences 为每句话第一个字母大写;characters为每个字母大写;words 为每个单词首字母大写;但该属性仅限于 text keybord,和尚在本地更换多种方式并未实现,有待研究;

10、keyboardType 为键盘类型,和尚理解整体分为数字键盘和字母键盘等;根据设置的键盘类型,键盘会有差别;

a. 数字键盘

--1-- datetime 键盘上可随时访问 : 和 /;

--2-- phone 键盘上可随时访问 # 和 *;

--3-- number 键盘上可随时访问 + - * /

b. 字母键盘

--1-- emailAddress 键盘上可随时访问 @ 和 .;

--2-- url 键盘上可随时访问 / 和 .;

--3-- multiline 适用于多行文本换行;

--4-- text 默认字母键盘;

11、textInputAction 通常为键盘右下角操作类型,类型众多,建议多多尝试;

12、autofocus 是否自动获取焦点,进入页面优先获取焦点,并弹出键盘,若页面中有多个 TextField 设置 autofocus 为 true 则优先获取第一个焦点;

13、focusNode 手动获取焦点,可配合键盘输入等减少用户操作次数,直接获取下一个 TextField 焦点;

14、enabled 设为 false 之后 TextField 为不可编辑状态;

15、decoration 为边框修饰,可以借此来调整 TextField 展示效果;可以设置前置图标,后置图片,边框属性,内容属性等,会在后续集中尝试;若要完全删除装饰,将 decoration 设置为空即可;

16、inputFormatters 为格式验证,例如原生 Android 中通常会限制输入手机号或其他特殊字符,在 Flutter 中也可以借此来进行格式限制,包括正则表达式;使用时需要引入 package:flutter/services.dart;

a. LengthLimitingTextInputFormatter 限制最长字符;

b. WhitelistingTextInputFormatter 仅允许输入白名单中字符;如 digitsOnly 仅支持数字 [0-9];

c. BlacklistingTextInputFormatter 防止输入黑名单中字符;如 singleLineFormatter 强制输入单行;

分析源码 RegExp("[/]") 可以设置正则表达式;

17、onChanged 文本内容变更时回调,可实时监听 TextField 输入内容;

18、controller 文本控制器,监听输入内容回调;

19、onTap 点击 TextField时回调;

20、onEditingComplete 在提交内容时回调,通常是点击回车按键时回调;

21、onSubmit 在提交时回调,不可与 onEditingComplete 同时使用,区别在于 onSubmit 是带返回值的回调;

问题小结:

当 TextField 设置 enableInteractiveSelection 属性后长按会出现菜单,默认为英文,可通过设置 Flutter 国际化来处理;

(1)在 pubspec.yaml 中集成 flutter_localizations;

2)在 MaterialApp 中设置本地化代理和支持的语言类型;

(1)将 maxLength 设置为 null 仅使用 LengthLimitingTextInputFormatter 限制最长字符;

(2)设置 InputDecoration 中 decoration 属性为空;但是底部有空余,只是隐藏而并非消失;

Flutter进阶篇(4)-- Flutter的Future异步详解

本文首发在公众号 Flutter那些事 ,欢迎大家多多关注。

工具安装:

Flutter基础篇:

Flutter进阶篇:

Dart语法基础篇:

Dart语法进阶篇:

说明:本文中的所有函数的引用在 main 函数中:

这里的执行结果是:

Futue直接new就可以了。我这里没有具体的返回数据,所以就用匿名函数代替了, Future future = new Future(() = null); 相当于 FutureNull future = new Future(() = null); 泛型如果为null可以省略不写,为了便于维护和管理,开发中建议加上泛型。

输出结果是:

future里面有几个函数:

then :异步操作逻辑在这里写。

whenComplete :异步完成时的回调。

catchError :捕获异常或者异步出错时的回调。

因为这里面的异步操作过程中没有遇到什么错误,所以catchError回调不会调用。

我们可以看到执行结果是:

我们可以看到输出结果是: 2 1 3 和我们创建Future对象的先后顺序完全一致。

我们可以看到结果为 1 2 3 ,和我们调用then的先后顺序无关。:

当then回调函数里面还有then回调的时候,这时候的流程跟前面就不太一样了,也是一个大坑,也是面试经常会被问到的一个知识点。

我们可以看到执行结果如下:

结果还是一样的:

运行结果是:

这里再次证明了上面我的猜想: 执行顺序和和创建Future的先后顺序有关,如果有多个then嵌套执行,先执行外面的then,然后执行里面的then。

执行结果如下,我们可以看到then内部创建的Future要等到then执行完了,最后再去执行的:

根据上文总结的特点,我们可以不用运行也能推断出输出结果:

为了验证我们的猜想,我们打印一下输出结果,果然我们的证明是正确的。

我们重点看看 then函数的文档说明:

then 注册在 Future 完成时调用的回调。

当这个 Future 用一个 value 完成时,将使用该值调用 onValue 回调。

如果 Future 已经完成,则不会立即调用回调,而是将在稍后的 microtask(微任务) 中调度。

如果回调返回 Future ,那么 then 返回的 future 将与 callback 返回的 future 结果相同。

onError 回调必须接受一个参数或两个参数,后者是[StackTrace]。

如果 onError 接受两个参数,则使用错误和堆栈跟踪时调用它,否则仅使用错误对象时候调用它。

onError 回调必须返回一个可用于完成返回的future的值或future,因此它必须是可赋值给 FutureOr R 的东西。

返回一个新的 Future ,该 Future 是通过调用 onValue (如果这个Future是通过一个value完成的)或' onError (如果这个Future是通过一个error完成的)的结果完成的。

如果调用的回调抛出异常,返回的 future 将使用抛出的错误和错误的堆栈跟踪完成。在 onError 的情况下,如果抛出的异常与 onError 的错误参数“相同(identical)”,则视为重新抛出,并使用原始堆栈跟踪替代

如果回调返回 Future ,则 then 返回的 Future 将以与回调返回的 Future 相同的结果完成。

如果未给出 onError ,并且后续程序走了刚出现了错误,则错误将直接转发给返回的 Future 。

在大多数情况下,单独使用 catchError 更可读,可能使用 test 参数,而不是在单个 then 调用中同时处理 value 和 error 。

请注意,在添加监听器(listener)之前, future 不会延迟报告错误。如果第一个 then 或 catchError 调用在 future 完成后发生 error ,那么 error 将报告为未处理的错误。


网站题目:flutter详细讲解,简书 flutter
分享地址:http://azwzsj.com/article/hoddch.html