本文首发在公众号 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。
我们先看一下目前的一些跨平台方案,从前端渲染的角度来分类的话,大致可以分为以下几种方案。
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 代码还需要深入学习。但相信理解之后再学,会轻松很多。