网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

anti-flutter,antiflutter adhesive

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

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

成都创新互联公司成立与2013年,是专业互联网技术服务公司,拥有项目成都网站建设、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元平邑做网站,已为上家服务,为平邑各地企业和个人服务,联系电话:18982081108

工具安装:

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 将报告为未处理的错误。

谁能告诉我有关各种阀门的英语翻译!!!

你要的基本上都有了,各种阀的名称、部件,相关用语。

如果你要各种阀门的解释,到这里

CQ螺纹球阀 CQ Thread Ball Valves

L形三通式 L-pattern three way

T形三通式 T-pattern three way

安全阀 Safety valve

暗杆闸阀 Inside screw nonrising stem type gate valve

百叶窗; 闸板 shutter

百叶窗式挡板 louver damper

摆阀式活塞泵 swing gate piston pump

保温式 Steam jacket type

报警阀 alarm valve

报警阀; 信号阀; 脉冲阀 sentinel valve

背压调节阀 back pressure regulating valve

背压率 Rate of back pressure

本体阀杆密封 body stem seal

波纹管阀 Bellows valves

波纹管密封阀 bellow sealed valve

波纹管密封式 Bellows seal type

波纹管平衡式安全阀 Bellows seal balance safety valve

波纹管式减压阀 Bellows reducing valve

波纹管式减压阀 Bellows weal reducing valve

薄膜 thin film

薄膜; 隔膜 diaphragm

薄膜式减压阀 Diaphragm reducing valve

薄型闸阀 Thin Gate Valves

不封闭式 Unseal type

槽车球阀 Tank Lorry Ball Valves

颤振 Flutter

常闭式 Normally closed type

常开式 Normally open type

超低温阀门 Cryogenic valve

超高压阀门 Super high pressure valve

超过压力 Overpressure of a safety valve

衬胶隔膜阀 rubber lined diaphragm

衬胶截止阀 rubber lined globe valve

垂直板式蝶阀 Vertical disc type butterfly valve

磁耦合截止阀 Magnetic Co-operate Globe Valves

带补充载荷的安全阀 Supplementary loaded safety valve

带辅助装置的安全阀 Assisted safety valve

单阀碟双面平行密封闸阀 parallel single disk gate valve

单口排气阀 Single Opening Exhaust Valves

单向阀 Non-return Valve

单闸板 Single gate disc

单闸板平板闸阀 Single Disc Flat Gate Valves

弹簧薄膜式减压阀 Spring diaphragm reducing valve

弹簧式安全阀 Direct spring loaded safety valve

弹簧座 Spring plate

弹性闸板 Flexible gate disc

当量计算排量 Equivalent calculated capacity

挡板 damper

导阀 Pilot valve

导向套 Valve guide disc guide

低温阀门 Sub-zero valve

低压阀门 Low pressure valve

底阀 bottom valve

底阀 Foot valve

电磁动装置 Eletro magnetic actuator

电磁阀 magnetic valve

电磁阀 solenoid valve

电磁-液动装置 Eletro magnetichydraulic actuator

电动阀 mortor operated valve

电动阀 motorized valve

电动截止阀 Electric Actuated Stop Valves

电动平行式双闸板闸板 Electric Double Disk Parallel Gate Valves

电动楔式闸阀 Electric Actuated Wedge Gate Valves

电动装置 Electric actuator

电-液动装置 Eletro hydraulic actuator

电液伺服阀 electro-hydraulic servovalve

调节弹簧 Regulation spring

调节阀 adjusting valve

调节阀 control valve

调节阀 regulating valve

调节螺套 Adjusting bolt Adjusting screw

调节圈 Adjusting ring

蝶板 Disc

蝶阀;瓣阀 butterfly valve

蝶阀;瓣阀;拍门;铰链阀 flap valve

蝶式缓冲止回阀 Butterfly Type Non-slam Check

蝶式止回阀 Butterfly swing check valve

定比减压阀 Proprutioning pressure reducing valve

定差减压阀 Fixed differential reducing valve

定值减压阀 Fixed pressure reducing valve

动态特性 Dynamic characteristics

对焊连接阀 Buttwelding valves

对夹蝶板阀 Wafer plate valves

对夹式衬胶蝶阀 Wafer Type Butterfly Valves with Rubber Itning

对夹式阀门 Clamp valves

对夹式止回阀 Wafer Check Valves

额定排量 Certified capacity

额定排量系数 Derated coefficient of discharge

二通阀 Two-way valves

阀 valve

阀板 valve deck plate

阀板 valve plate

阀板式活塞泵 valve deck plate type piston pump

阀板式活塞泵 valve plate type piston pump

阀瓣 Disc

阀操纵杆 valve operating rod

阀痤槽 valve seat recess

阀挡 valve grid

阀挡 valve positioner

阀挡 valve stop

阀导杆 valve tail rod

阀导向器 valve guide

阀盖 bonnet

阀盖衬套 bonnet bush

阀盖垫片 bonnet gasket

阀杆 stem

阀杆 valve rod

阀杆 valve spindle

阀杆端部尺寸 Dimmension of valve stem end

阀杆环 stem ring

阀杆螺母 Yoke bushing Yoke nut

阀杆填料 stem packing

阀杆头部尺寸 Dimension of valve stem head

阀簧 valve spring

阀簧压板 valve spring plate

阀控水锤泵 valve-controlled hydraulic ram

阀框架 valve yoke

阀门 Valve

阀门传动装置 valve bandle set

阀门和管件 Valves and Fittings

阀门盘根 valve packing

阀门手柄 valve handle

阀盘 disc

阀盘 valve disc

阀片 Disc

阀球 valve ball

阀驱动臂 valve driving arm

阀驱动臂 valve motion arm

阀式活塞 valve type piston

阀式活塞 valve type bucket

阀室式活塞泵 valve box type piston pump

阀室式活塞泵(美) valve pot type piston pump

阀抬起装置 valve lifting device

阀体 body

阀体 valve body

阀箱 valve box

阀箱 valve cage

阀箱 valve chest

阀箱;阀限位器 valve guard

阀箱盖 cover for valve box

阀箱盖 valve box cover

阀箱式活塞泵(美) turret type piston pump

阀形活塞泵 valve type piston pump

阀座 Seat ring

阀座 valve carrier

阀座 valve seat(body seat)

阀座;阀盘 valve seat

阀座环 seat ring

阀座密封嵌条 sealing strip for valve seat

法兰 flange

法兰堵头 blind flange

法兰端 flange end

法兰接头 flange joint

法兰连接紧固件(双头螺栓和螺帽) flange bolting

法兰密封面,法兰面 flange facing

法兰面加工 flange facing finish

法兰球阀 Flange Ball Valves

翻板阀 Flap

反冲盘 Disc holder

反向作用式减压阀 Reverse acting reducing valve

反向作用式减压阀 Reverse acting reducing valve

放空阀 emptying valve

放气阀 air vent valve;vent valve

放气阀;排气阀 air evacuation valve

放泄阀 escape valve

分置阀室式活塞泵 separate valve box type piston pump

分置阀室式活塞泵(美) side pot type piston pump

封闭式 Seal type

浮动式球阀 Float ball valve

浮球 Ball float

浮球阀 Float Valve

浮球式疏水阀 Ball float steam trap

浮球式疏水阀 Free Float Type Steam Trap

浮桶 Bucket float

浮桶式疏水阀 Open bucket steam trap

辅助(副)阀 Auxiliary valves

负荷率 Rate of load condensate

附加背压力 Superimposed back pressure

复位弹簧 Returnning spring

杠杆式 Lever type

杠杆式安全阀 Lever and weight loaded safety valve

杠杆式减压阀 Lever reducing valve

高温阀门 High temperature valve

高压阀门 High pressure valve

格兰密封 gland

隔离阀 isolating valve

隔膜 Diaphragm

隔膜阀 diaphragm valve

隔膜式控制阀 diaphragm operated comtrol valve

工作背压 Operating back pressure

工作温度 Operating temperature

工作温度 Working temperature

工作压差 Operting differential pressure

工作压力 Operating pressure

工作压力 Working pressure

公称通径 Nominal diameter

公称压力 Nominal pressure

固定式球阀 Fixed ball valve

关闭压力 Lockup pressure

关阀过冷度 Subcooled temperature of close valve

关阀温度 Closing valve temperature

管道安全阀 Piping Safety Valves

过冷度 Subcoold temperature

过流阀(或节流阀) Restrictor Valves

喉径 Throat diameter

滑阀 slide valve

滑阀式回转活塞泵 rotary piston pump with slide gate

滑阀型转子泵 eccentric rotary pump with sliding sleeve

环形阀 annular valve

环形阀 double beat valve

换向阀 selector valve

换向阀 shuttle valve

回转滑阀活塞泵 piston pump with rotary gate

回座压力 Re-seating pressure of a safety valve

活塞昵减压阀 Piston reducing valve

活塞式阀 piston valve

活塞式阀;柱塞式阀 plunger valve

活塞式减压阀 Piston reducing valve

减速阀 Deceleration valves

减压比 Pressure reducing ratio

减压阀 pressure reducing valve

浆液阀 Parallel Slide Valves

角阀 Angle Valve

角阀 isolation valve angle configuration

角式 Angie type

角式节流阀 Angle Throttle Valves

角式截止阀 Angle Stop valves

铰链阀;片状阀 flapper valve

节流阀 throttle valve

节流阀 choke valve

节流阀;节流 throttle

结构长度 Face-to-face dimension ;End-to-end dimension; Face-to-centre dimension

结构形式 Type of construction

截止阀 Globe valve

截止阀 Shut-off Valve

截止阀;关断阀 shut-off valve

截止式隔膜阀 Globe diaphragm valve

紧急切断阀 Emergeny Cut-off Valves

进气阀 air intake valve

进水阀;进口阀门 inlet valve

静态特性 Static characteristics

静态特性偏差 Static characteristics derivation

开阀过冷度 Subcooled temperature of open valve

开阀温度 Opening valve temperature

开启高度 Lift

壳体试验 Shell test

壳体试验压力 Seal test pressure

空气阀门 Air valves

快速排污阀 Quick Draining Valves

类型 Type

冷凝结水排量 Cold condensate capacity

冷态试验差压力 Cold differential test pressure

理论排量 Theoretical flowing capacity

连接槽尺寸 Dimension of connecting channel

连接尺寸 Conncetion cimension

连接形式 Type of connection

帘面积 Curtain area

流道面积 Flow area

流道直径 Flow diameter

流量孔板 flow orifice plate

流量控制阀 flow control valve

流量特性 Flow characteristics

流量特性偏差 Flow characteristics derivation

漏汽量 Steam loss

脉冲式疏水阀 Impulse steam trap

密封面 Sealing face

密封试验 Seal test

密封试验压力 Seal test pressure

明杆平行式双闸板闸板 Double Disk Parallel Gate Valves

明杆闸阀 Outside screw stem rising through handwheel type gate valve

膜片 Diaphragm

内压自封 Pressure seat

逆止阀;止回阀 check valve

逆止阀;止回阀 non-return valve

逆止阀;止回阀;单向阀 check valve

排放背压力 Brilt-up back pressure

排放压力 Relieving pressure

排灰阀 Ash valves

排量系数 Coefficient of discharge

排气阀 air release valve

排气阀 Exhaust valves

排气阀 Vent Valve

排水阀 Drainage valves

排水温度 Temperature at discharging condensate

排污阀 blowdown valve

排污箱(阀) Waste Valves

排渣闸阀 Scum Gate Valves

盘阀 moushroom valve

盘状阀 plate valve

旁路阀 by pass valve

配汽活塞阀缸套 piston valve line

喷射阀 injection valve

喷射阀 sprayer valve

喷水阀 spray water valve

频跳 Chatter

平衡阀 Balance valves

平衡式 Balance type

平行式闸阀 Parallel gate valve Parallel slide valve

启闭件 Disc

启闭压差 Blowdown of a safety valve

起始升程 Commencement of lift

气动装置 Pneumatic actuator

气阀摇臂 valve arm

气-液动装置 Pneumatic-hydraulic actuator

潜水电泵(排污泵) Submerged Motor Pumps

切断阀;截止阀 block valve;shut-off valve;stop valve

切断式止回阀 stop check valve

切换阀;多向阀 changeover valve

球、球芯 Ball

球阀 Ball valve

球阀 globe valve

球体 Ball

全启式安全阀 Fall lift safety valve

热凝结水排量 Hot condensate capacity

入口隔离门 suction isolating valve

塞子 Plug

三通阀 three-way isolating valve

三通阀 three-way valve

三通式 Three way type

上密封 Back seat

上密封试验 Back seal test

渗漏量 Leckage

升降立式止回阀 Vertical lift check valve

升降式止回阀 Lift check valve

适用介质 Suitable medium

适用温度 Suitable temperature

手摇油泵(阀) Manual Oil Pumps Valves

疏水阀 drain valve

双金属片式疏水阀 Bimetal elements steam trap

双口排气球 Double Opening Exhaust Valves

双联弹簧式安全阀 Duplex safety valve

双闸板 Double gate disc

双闸板平板闸阀 Double Disc Flat Gate Valves

水封闸阀 Water Seal Gate Valves

水力喷射器(真空泵) Vacuum Pumps

伺服阀 servovalve

填料 Packing

填料垫 Packing seat

填料函 Stuffing

填料式旋塞阀 Gland packing plug valve

填料箱 Stuffing box

填料压盖 Gland

通气阀 breather valve

通气阀;呼吸器 breather

通用阀门 General valve

吐出阀;排出阀 discharge valve

吐出阀限位器 delivery valve guard

微启式安全阀 Low lift safety valve

微阻缓闭止回阀 Tiny Drag Slow Shut Check Valves

吻合度 Percent of contact area

蜗轮传动蝶阀 Butterfly Valves with Gear Actuator

蜗轮传动装置 Wormgear actuator

屋脊式隔膜阀 Weir diaphragm valve

无阀泵 valveless pump

无阀隔膜泵 valveless diaphragm pump

无阀振动泵 valveless vibration pump

无负荷漏汽量 No-load steam loss

无负荷漏汽率 Rate of no-load steam loss

吸(抽)气阀 Aspirating valves

吸入阀 suction valve

吸入阀限位器 suction valve guard

先导式安全阀 Pilot operated safety valve

先导式液压阀 Pilot-operated reducing valve

相对静偏差 Relative static characteristics derivation

相对流量特性偏差 Relative flow characteristics derivation

相对压力特性偏差 Relative pressure characteristics derivation

销轴 Hinge pin

楔式闸阀 Wedge gate valve

斜板式蝶阀 Indined disc butterfly valve

泄料(放空,排污)阀 Blowdown valves

泄压阀 Decompression valves

泄压阀 pressure release valve

泄压阀;安全阀 relief valve

卸荷式减压阀 Balanced reducing valve

型号 Type Model

旋启多瓣式止回阀 Multi-disc swing foot valve

旋启式止回阀 Swing check valve

旋启双瓣式底阀 Double disc swing foot valve

旋塞阀 Cock

旋塞阀 plug valve

压力(増压)阀 Pressure valve

压力调节阀;压力控制阀 pressure controlled valve

压力特性 Pressure characteristics

压力特性偏差 Pressure characteristics derivation

压力增长系数 Pressure increasing ratio

摇杆 Arm

液动装置 Hydraulic actuator

液化气管件 LPG Pipe Fitting

液下泵 Under Water Pumps

液压执行器 hydraulic actuator

仪表针形截止阀 Meter Needle Type Globe Valves

溢流阀 overflow valve

翼形阀;锥形阀 wing valve

油封式旋塞阀 Lubricated plug valve

有阀翼板 double acting wing

有阀翼板 wing with valve

有负荷漏汽量 Load steam loss

有负荷漏汽率 Rate of load steam loss

圆板阀;圆盘阀 disc valve

圆盘式疏水阀 Shemostatic team trap

圆柱齿轮传动装置 Cylindrical gear actuator

圆锥齿轮传动装置 Conical gear actuator

闸板 Wedge disc

闸板式隔膜阀 Wedge diaphragm valve

闸阀 gate valve

闸阀 sluice valve

针形阀 Pintle valve ; Needle valve

真空破坏阀 vacuum breaker valve

蒸汽疏水阀 Automatic steam trap Trap

整定压力 Set pressure

正向作用式减压阀 Direct acting reducing valve

支架 Yoke

直接载荷式安全阀 Direct loaded safety valve

直接作用式减压阀 Direct-acting reducing valve

直流式 Y-globe type

直流式截止阀 Oblique Stop Valve

直通单向阀 inline check valve

直通单向阀 straightway check valve

直通阀 Throughway Valve

止回阀 Check Valve

止回阀;回流阀 reflux valve

制动阀 Brake valves

中压阀门 Middle pressure valve

钟形浮子式疏水阀 Inverted bucket steam trap

钟形罩 Inverted bucket

轴套 Axis Guide

主阀 Main valve

主要外形尺寸 Prime out-form dimensions

主要性能参数 Specifeca tion speeification

注液漏斗阀 Priming Tundish Valve

柱塞阀 Plunger valve

柱塞截止阀 Plunger Globe Valve

柱塞型摆动阀 rocking plunger valve

撞击手轮 Impact handwheel

锥形阀;翼形阀 conical valve

自动循环阀 Automatic Recirculation Valve

组合阀 Combination valves

最大过冷度 Maximum subcoold temperature

最大流量 Maximum flow rate

最大压差 Maximum differential pressure

最低工作压力 Minimum operating pressure

最高背压率 Maximum rate of back pressure

最高工作背压 Maximum operating back pressure

最高工作温度 Maximum operating temperature

最高工作压力 Maximum operating pressure

最高排水温度 Maximum temperature at discharging

最高允许温度 Maximum allwable temperature

最高允许压力 Maximum allowable pressure

最小过冷度 Minimum subcooled temperature

最小压差 Minimum differntial pressure

有关游泳的英文单词

breaststroke:蛙泳;back stroke:仰泳;side stroke:侧泳;butterfly stroke:蝶泳;dolphin butterfly stroke:海豚式蝶泳;Dog Paddle:狗爬式游泳;Medley swimming:混合泳。

游泳装备的词语:swimming cap 游泳帽;swimsuit 泳衣;bikini 比基尼泳衣;swimming goggles 游泳镜;swimming trunks 泳裤;kickboard 踢水板;nose clip 鼻夹;web-footed 脚蹼。

扩展资料:

游泳注意事项:

1、必须在家长(监护人)的带领下去游泳。单身一人去游泳最容易出问题,如果你的同伴不是家长(成年人),在出现险情时,很难保证能够得到妥善的救助。(小孩忌)

2、身体患病者不要去游泳。中耳炎、心脏病、皮肤病、肝、肾疾病、高血压、癫痫、红眼病等慢性疾病患者,及感冒、发热、精神疲倦,身体无力都不要去游泳。

因为上述病人参加游泳运动,不但容易加重病情,而且还容易发生抽筋、意外昏迷,危及生命。传染病患者易把病传染给别人。另外女同学月经期间均不宜游泳。

参考资料来源:百度百科-游泳

Flutter入门这一篇效率文章就够了

本文面向 Flutter 初学者,旨在用易懂的方式带大家入门。除了 Flutter 代码,还会介绍到语法、原理、特性等基础知识。相信本文能帮助你学习和理解 Flutter。

我们先看一下目前的一些跨平台方案,从前端渲染的角度来分类的话,大致可以分为以下几种方案。

WebView 渲染

这种方案就很好理解,现在很多项目都会嵌入 H5 的页面。就是用 JavaScript 等前端技术进行开发,在客户端上用 WebView 来进行渲染。微信小程序目前使用的就是这种方案。

它的优点很明显,使用成熟的前端技术进行开发,学习成本低,开发效率高,并且支持动态发布代码。

但缺点也很明显,在性能体验上,和原生还是存在较大差距的。

原生控件渲染

既然 WebView 的性能不够好,于是就有了使用原生控件进行渲染的方案。这种方案,同样也是使用 JavaScript 开发,区别是它最终是调用原生控件进行渲染的。这种方案的代表是 Facebook 的 React Native。

由于使用原生控件进行渲染,性能体验也会更接近原生。但也只是更接近,和原生还是有差距的,因为它需要频繁的进行 JavaScript 和原生之间的通信,这个通信效率是比较低的。

另外,由于需要适配各个平台的控件,那就有可能出现,系统控件更新了,而框架本身还没有更新,由此产生了一些问题。换句话说,这种方案是受到原生控件限制的。

绘图引擎渲染

接下来就是主角了。

在前端,如果完全不使用原生控件,我们可以通过系统的绘图 API 绘制出一个用户界面。从这个角度出发,可以在各个平台使用一个统一接口的绘图引擎来进行界面绘制,这个引擎最终调用的是系统的 API 绘制的。这样的话,它的性能可以做到接近原生,并且又不受原生控件的限制,在不同平台上能够做到 UI 统一。

Flutter 就是这样的一个开发框架。

一个跨平台 UI 解决方案

Flutter 是由 Google 开发的,一个跨平台 UI 解决方案。换句话说,它原则上只管 UI 的问题,如果涉及到平台本身的一些功能,比如调用蓝牙、摄像头,一般还是需要原生代码去操作。但现在也会有一些第三方库帮我们解决这些问题。

绘图引擎 Skia

Flutter 使用 Skia 作为它的绘图引擎。Skia 已经被 Google 收购,目前很多 Google 旗下的产品都是用 Skia 绘制的,包括 Android。

Android 内置了 Skia,但 iOS 没有,所以在打 iOS 安装包的时候,会把 Skia 一起打进去。这就导致了,用同一份 Flutter 代码打包之后,iOS 的包要比 Android 的包大一些。

开发语言 Dart

Flutter 使用的开发语言,叫 Dart。Dart 也是 Google 自家的,它是一门面向对象的语言,从它身上会看到一些其他开发语言的影子。学习起来难度不大的。

前面讲跨平台方案的时候,可以发现别的方案基本都是用 JavaScript 作为开发语言的,但为什么 Flutter 不用?就因为 Dart 是谷歌自家的吗?这个问题先留着,我们后面会提到。

这里部分就简单点带过了,具体的搭建流程可以在官网查看:

主要的搭建步骤如下:

下载 Flutter SDK

官网下载地址:

由于在国内访问可能受限,官方为中国开发者搭建了镜像:

更新环境变量

解压后,将 flutter\bin 的全路径添加到环境变量 PATH 中。

安装开发工具

理论上,任何文本编辑器都可以用来开发 Flutter 应用,但推荐的开发工具是 Android Studio、IntelliJ 以及 VS Code。因为在这些开发工具上,可以安装官方的 Flutter 和 Dart 插件,得到更好的开发体验。文章里使用 Android Studio 来演示。

如果你打算开发 iOS 应用,则还需要安装 Xcode。

安装插件

在开发工具的插件设置中,安装上面说到的 Flutter 和 Dart 插件。Flutter 插件用于支持 Flutter 的运行、调试、热重载等功能,而 Dart 插件则提供了代码的输入校验、代码补全等功能。

万物始于 Hello World,我们先来创建一个显示 Hello World 的 Flutter 项目。

在 Android Studio 的欢迎页面选择 Start a new Flutter project ,或者通过菜单栏的 File New New Flutter Project ,创建一个新的 Flutter 项目。

创建好的项目里面包含了 android 和 ios 两个文件夹,它们是标准的 Android 和 iOS 项目。我们的 Flutter 代码,存放在 lib 文件夹里。项目创建好后,会默认带一个计数器的示例,我们不管它,把 main.dart 的代码改成 Hello World:

启动一个模拟器,或者连上真机,点击 Run 运行一下,就能看这样一个界面了:

具体代码先混个眼熟就好,具体的后面会再讲到。

在写 Flutter 之前,还要先跟大家简单介绍一下 Dart 的语法。如果你有 Java 或 JavaScript 的开发经验,以及面向对象的编程思想,学起来是很快的。

我们可以在 test 文件夹下新建一个 dart 文件,用来写测试代码。

指定类型

var

但和 JavaScript 不同的是,以下代码在 JavaScript 是不会报错的,但在 Dart 里会报错:

Object

如果非要上面这样写,那也可以。把 var 换成 Object 就不报错了:

和 Java 类似,Object 是所有对象的根基类。但是这样的话,如果想打印一下 num 的字符串长度,是会报错的:

因为 length 是属于 String 的,但系统只知道 num 是一个对象,并不知道它是一个 String。

dynamic

如果还是非要这样写,那也可以。Dart 有一个特有的关键字 dynamic,把 Object 改成 dynamic 就不报错了:

我们运行一下这个文件,可以在控制台看到正确打印出了字符串长度。

函数

dynamic

在 Dart 里,函数也是可以不写返回类型的,不写的话会被当做 dynamic 来处理。这样的话,函数的类型就是 return 的类型,如果没有 return 则是 void 类型。比如可以这样:

运行之后是能正确打印出字符串长度的。

用于传参

Dart 里的函数也是一个对象,所以可以把函数作为参数来传递,比如:

可选参数

在 Dart 的函数传参里,有一个叫可选参数的概念,我们以文字控件 Text 为例,在源码里可以看到 Text 的构造函数是这样的:

首先,在参数里有一个 data,它是要显示的文字内容,是一个必填项。而 data 后面的一堆参数,是用一个大括号括起来的,这些参数就叫做可选参数,意思是这些参数可传可不传。

假如我们要显示一个比较长的文字,又想限制它最多显示两行,就可以这样来创建一个 Text:

可选参数,在 Flutter 里面用的非常多。

异步

Future

在 Dart 里使用 Future 来处理异步任务,比如我们现在延时一秒打印 666,代码如下:

Future 的语法和 Promise 非常像。任务执行成功会调用 then,执行失败会调用 catchError,而无论成功还是失败,都会调用 whenComplete。

async/await

如果你不喜欢上面那种写法,或者是想把异步转成同步,就可以用 async 和 await 这两个关键字来转换。

我们把上面的代码转换一下,写一个 getString 方法,返回的类型是 Future,它会延时返回一个字符串。在 main 函数后面加上 async 关键字,在 getString() 前面加上 await,代码如下:

运行之后可以看到,能正常延时一秒后,把字符串打印出来。这里 getString() 返回的类型是 Future,而 await getString() 则是返回了延时之后返回的字符串。await 要在 async 的函数里面才能使用。

async 和 await 其实是一个语法糖,它最终也是转换成 Future 调用链的形式执行的。

接下来回到 Flutter,Flutter 里最重要的一个概念是 Widget(下面翻译作控件)。

在原生开发里面,我们可能会在界面上区分,这是一个 View,这是一个 Layout,这是一个 View Controller。但在 Flutter 里面,它们全都属于一个统一的模型 Widget。可以说,在 Flutter 界面里,所有东西都是 Widget。

以前学面向对象的时候,我们都听过一句话,叫万物皆对象。我这里套用一下,在 Flutter 里, 万物皆控件 。

具体有哪些控件,我做了一下简单的分类。

根控件

所有的控件都属于 StatefulWidget 或 StatelessWidget 。它们的区别是,StatefulWidget 拥有状态 State ,而 StatelessWidget 没有。

StatefulWidget

当一个控件是可变的时候,就要使用 StatefulWidget 来构建。StatefulWidget 本身不可变,但它持有的状态 State 是可变的。

StatelessWidget

当一个控件状态是固定不可变的时候,就可以使用 StatelessWidget。前面我们写的 Hello World 就是使用 StatelessWidget。

容器控件

容器类控件一般是将某些属性或配置,作用在它的子控件上,比如控件所在的宽高、背景、位置等。

常用的容器控件有 Container、Center、Padding 等。

布局控件

布局控件可以类比作原生开发中的 Layout,通常它会拥有一个 children 的属性,用于接收一个控件数组,对这些控件进行特定的排版。

常用的布局控件有 Row、Column、Stack、Flex 等。

基础控件

基础控件就是常用的文字、按钮、图片等控件。

常用的基础控件有 Text、TextField、Button、Image 等。

功能控件

在 Flutter 里还有一类控件,它们不影响 UI 布局,但带有一些特定的功能,比如页面跳转、事件监听、定义主题等。我们把这一类控件称作功能控件。

常用的功能控件有 Navigator、NotificationListener、Theme 等。

开始写 Flutter 代码了。还记不记得,在 Flutter 项目创建之后,是自带一个计数器 demo 的,现在我们用自己的代码实现一遍。代码修改成如下:

运行之后,就可以看到这样的界面了:

按钮每点击一次,数字就会加一。下面我们来分析一下这段代码,看下里面用到的一些 Widget。

StatefulWidget

由于页面中的数字是跟随状态变化的,所以该页面改用 StatefulWidget。StatefulWidget 并不会直接返回一个 Widget,而是返回状态 State,在 State 里再返回 Widget。

Scaffold

Scaffold 是一个标准的 Material Design 页面,它包含了标题栏、浮动按钮、侧滑菜单、底部导航栏等配置。我们这里用到了标题栏 appBar、页面内容 body、浮动按钮 floatingActionButton。

AppBar

AppBar 就是标题栏,通过查看控件的构造方法,我们可以知道它可配置的属性。

AppBar 的可选参数除了标题 title,还可以配置标题前的内容 leading,右侧的操作按钮 anctions,控件垂直高度 elevation 等。我们只传了 title,其他属性都用默认值。

Center

Center 是一个容器类控件,它的作用就是让它的子控件居中显示。

FloatingActionButton

熟悉安卓开发的应该对这个控件比较熟悉,它就是页面右下角一个特定样式的 Button,参数里面的 onPressed 是一个必填项,要传一个点击之后的回调函数。

根据这个例子,下面给大家介绍一下 Flutter 两个比较重要的特性。

点击 Button 之后,我们把 num 变量加一,并使用 setState 通知状态发生了改变,Flutter 会根据新的状态更新 UI。如果有接触过小程序开发,setState 就和小程序的 setData 类似。

在 Flutter 里面我们不需要用 set 方法来更新 UI,可变控件是和状态绑定的,这就是 Flutter 的响应式 UI 编程。

在 Android Q 和 iOS 13 里都加入了暗黑模式,我们也换一个暗黑主题来玩一下。MaterialApp 里有一个 theme 的属性,我们把它配置一下:

这次改完之后不点 Run 了,我们点一下闪电图标 Flutter Hot Reload ,就能看到界面发生了变化:

这就是 Flutter 的 热重载 ,在修改完代码之后,通过热重载就能马上在设备上看到修改结果,可以很大程度上增加开发效率。

下面再给大家介绍几个 Flutter 里的常见操作。

在 Flutter 里,使用 Navigator 来管理页面跳转,比如要跳转到一个 NewPage 可以这样写:

进栈使用 push,出栈则是 pop。

使用 MaterialPageRoute 会模拟出 Android 上页面跳转的过场效果。

我们来看看怎么显示一张本地图片。

先在根目录新建一个存放图片的文件夹,比如叫 images,把图片 picture.png 放进去。

找到根目录下的 pubspec.yaml 文件,这个便是 Flutter 依赖配置文件,我们需要在这里配置一下刚才的图片:

这样,我们就能使用 Image 控件把这张图片显示出来了:

和 node 的 npm 以及 Android 的 jcenter 类似,Flutter 也拥有一个公共仓库 pub.dev。pub.dev 是 Google 官方的 Dart 仓库,在上面可以找到我们需要的包和插件。

Flutter 本身没有 Toast,我们来接入一个。在 pub.dev 上搜索后,我决定使用 fluttertoast:

按照说明,在 pubspec.yaml 文件里的 dependencies 下配置:

点一下 Android Studio 右上角的 Packages get 同步之后就可以使用了:

我们上面使用的都是 Material Design 的控件,它们都是在 flutter/material.dart 包里面的。如果要使用 iOS 风格的控件,则要用到 flutter/cupertino.dart 包:

iOS 风格的控件,基本都以 Cupertino 开头。我们把计时器页面里的控件替换一下:

效果如下:

代码的部分就到这里了,接下来跟大家聊一下编译方式,编程语言的编译方式有两种。

关于它们孰优孰劣,就要看从哪个角度去对比了。JIT 的话,它的一大特点就是支持动态发布代码,也就是支持热更新。但要是从性能的角度考虑,AOT 会更好,因为在运行的时候不用再进行编译的操作的,运行的效率会更高一些。

回到我们一开始的时候留下的问题,为什么别的跨平台方案都是用 JavaScript,而 Flutter 要用 Dart 来开发。JavaScript 的编译方式是 JIT 的,它不支持 AOT。而 Dart 同时支持 JIT 和 AOT。

Flutter 在开发阶段使用 JIT,让我们用上了热重载,增加了开发效率。在打包时改用 AOT,保证了正式版应用的性能。

最后讲一下大家比较关心的一个东西,Flutter 是否支持热更新?前面说到 Dart 支持 JIT,所以从技术层面它是支持的。但是目前是不支持的,在官方的计划文档中,可以看到:

至于原因,官方在这里进行了说明。总的来说,是由于政策的限制,以及出于对性能和安全性的考虑,暂时不支持了。

到这就结束啦。由于想把 Flutter 基础在一篇内讲完,没有涉及太多细节,如果要写 Flutter 代码还需要深入学习。但相信理解之后再学,会轻松很多。


新闻名称:anti-flutter,antiflutter adhesive
当前地址:http://bjjierui.cn/article/phghoc.html

其他资讯