23

哥哥带你学Dart

 5 years ago
source link: https://studygolang.com/articles/20169?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

概念:

Dart是什么?

具体Dart语法内容请走这边: https://www.jianshu.com/p/9e5f4c81cc7d

Dart是一门新的编程语言,如同JAVA、PHP一样,是为了解决编写应用程序中的一些实际问题而被造轮子发明出来的,而这个造轮子的人就是 Google。可能大家都熟悉Google 的另一个轮子Golang,而对Dart 听闻甚少,其实Dart 的出生跟Go很相近,只是由于它的星途比起Go来说有点坎坷,一直没有被广大开发者重视,相关的技术文章和应用比较匮乏,也就一直蒙尘在泛泛语言之中。

最初设计Dart,是Google的一帮程序员出于对JavaScript的不满,决定自己搞一个新语言用来替换JavaScript的,所以刚开始Dart也就是用来作为浏览器脚本运行在浏览器中的。为了推广Dart,Google利用自己的利器Chrome让它内置了DartVM的引擎。有了运行环境,加上用户群的可观数量,Dart最初也赢得了部分前端开发者的青睐。但是!!!,咳咳,这里要停顿一下,有转折——Google的这帮程序员万万没想到,看似并无大用的JavaScript居然因为NodeJS而焕发了第二春。此时移动互联网处于萌芽发展中,一个叫做NodeJS的开源项目借助这股移动互联的东风顺势而起,很快的烧遍了前端、烧到了后端,甚至烧到了手机应用和桌面应用,可以说是在编程界无孔不入,几乎成就了JS程序员口中的“凡是能被JS实现的,最终都要被JS实现”的愿景。前端的开发模式因此而改变,进入了一个新的天地。一些明星项目如React、React-Native、Vue等等如雨后春笋般迅速的崛起,一句话总结就是“Javascript很忙”。

Javascript很忙,程序员更忙,Dart就这样被慢慢地遗忘在角落。加上一直以来缺少顶级的项目使用,就算再是亲儿子,得不到JS开发者的心,Google也没什么办法,在2015年的时候,Google在Chrome中默默的移除了内置的Dart引擎。但是!!!这里又是但是,我喜欢在但是这里停顿一下,可以刷存在感2333——Google并没有放弃Dart,Google内部用Dart编写孵化了一个移动开发框架Sky,之后又被命名为Flutter,进入了移动跨平台开发的领域。如同Javascript,Dart在服务端和浏览器前端也在不遗余力的发展:服务端可以编写命令行程序,前端可以编译成Javascript运行在浏览器中。Google的另一个前端大杀器Angular也有对应的Dart版本。在Google的未来操作系统Fuchsia中,Dart被指定为官方的开发语言。

Dart的发展经历这么多,在历史的版本迭代中,已经不是当初设计的仅仅作为一个脚本运行在浏览器中了。船小好调头,也正是使用者较少,没有历史包袱,Dart的创造者们总结了Dart1.0版本的优缺点,决定打造一个运行更快、更加安全的强类型语言Dart2.0(在Dart2.0之前,Dart是一门弱类型语言。变更为强类型语言(注:官网原文是 Dart 2.0 has a sound type system )之后,Dart依旧可以使用类型推断等弱类型语言的特性)。Dart2.0版本目前正处于dev的状态,开发者可以使用Dart进行开发了,在不久之后就会发布正式的版本。

Dart 属于什么级别的语言

Dart 属于应用层编程语言。它有自己的 DartVM ,通常情况下运行在自己的VM上,但是在特定情况下他也可以编译成 Native Code 运行在硬件上(比如移动开发框架中,Flutter 会将代码编译成指定平台的 Native Code 以提高性能)。运行 Dart 编写的软件,既可以以明文代码的方式直接运行,还支持运行快照打包后的二进制,以提高启动速度、安全性和性能。你可以将它当做JAVA,亦可以当做 JavaScript;它比 JAVA 简单,易于理解,比JavaScript 更加规范,更加工程化。

Dart 的特性

单进程异步事件模型;

强类型,可以类型推断;

DartVM,具有极高的运行效率和优秀的代码运行优化,根据早前的基准测试,性能比肩 Java7 的JVM;

独特的隔离区( Isolate ),可以实现多线程;

面向对象编程,一切数据类型均派生自 Object ;

运算符重载,泛型支持;

强大的 Future 和 Streams 模型,可以简单实现高效的代码;

全平台语言,可以很好的胜任移动和前后端的开发。

在语法上,Dart 提供了很多便捷的操作,可以明显减少代码量。比如字符连接,可以直接"my name is $name, age is $age",无需+号拼接,也无需做类型转换。

使用 Dart 可以做什么

登录 Dart 的官网,你可以很清楚的看到 Dart 的创作者将 Dart 明确的分成了三个方向: 移动开发、DartVM 命令行程序(Server 端)、浏览器(前端)。

移动开发:这是 Dart 的杀手锏,也是众多 Dart 开发者开始接触学习 Dart 语言的原因。这个移动开发的核心是叫做 Flutter 的一个框架,它使用Dart + C++ + Skia 开发,对外提供了完全不依赖系统平台的 Widget 的能力,只通过自绘图形的方式工作,因此具有极其优秀的跨平台性。目前已经支持了 iOS、Android、Fuchsia。可以想象,你对应 Android 编写的一套软件可以不用修改一行代码的运行在 iOS 中,甚至是未来的 Fuchsia 中(尽管不知道这个系统最终能不能发布出来),是不是很有要马上去尝试的心动?

DartVM 命令行程序:就是写服务端的应用。比如写个 http 的服务,对应用提供 api ,都是及其简单的事情。和 JavaScript 一样,Dart 也是单进程异步事件的模型,所以它天生擅长高并发,而且它还提供了隔离区(isolate)的接口,可以实现多线程的操作,应对CPU密集型场景也不再话下。

浏览器:这个应该是 Dart 一开始造轮子的初衷,结局嘛,大家也都是知道,还是 JS 一统江湖。所以我只是建议大家在前端用用看,毕竟 Angular 也有官方的团队在支持 Dart 的版本,而且用 JS 写简单的应用还好,复杂的场景下那个代码真的是。。。。这个时候用 Dart 一定会给你一个完全不一样的体验。当然,可能开发效率上Dart会逊色一些,但维护成本上 Dart 绝对碾压 JS。(这里用“碾压”是一种夸张的手法,望知.)

总之,Dart 可以做的很多,涉及到编程的方方面面。但是当下我最看好的是移动开发的前景。Google 也是想鼓励开发者使用这个Flutter 来为以后的 Fuchsia 打基础,做生态,所以 Flutter 这块各位可以放心大胆的用起来。对。就是现在!!!

为什么要用 Dart

Dart 仅仅是你工作中解决问题的一种选择,我认为特定的场景中使用最适合的语言编程才是聪明人的做法,所以为什么要用 Dart 这取决于你。如果非要给个理由,那可能就是 Flutter 让你爱上的原因。

学习 Dart 的路线

不管你是 JavaScripter、JAVAer,还是PHPer、Pythoner,还是Goer、Ruster,都可以用极低的成本学习 Dart ,并在短时间内上手做东西。如果你是一个开发的入门者,那我建议你还是先学习一下国民语言C,无论你是不是要学习 Dart,你都应该先走学习 C 的路线。

学习 Dart 的路线,我只针对有编程经验的人来说,可以分成四步:基础语言语法 ;代码编写风格;基础类库的使用;开始你的编程。

我比较鼓励开发者在学习新语言的时候尽早的上手项目去使用它。只有你在编程中反复的使用,你才会理解继而更好的运用这个语言的优势。如果可能,还可以在一段时间后对代码进行重构,更能加深对该语言的组织和整体语言的进一步理解。

Dart 入门教程

1, 所有能够使用变量引用的都是 对象 , 每个对象都是一个 的实例。在 Dart 中 甚至连 数字、方法和 null 都是对象。所有的对象都继承于  Object  类

2,使用静态类型(例如前面示例中的 num ) 可以更清晰的表明你的意图,并且可以让静态分析工具来分析你的代码, 但这并不是牵制性的。(在调试代码的时候你可能注意到 没有指定类型的变量的类型为 dynamic。)

3,Dart 在运行之前会先解析你的代码。你可以通过使用 类型或者编译时常量来帮助 Dart 去捕获异常以及 让代码运行的更高效。

4,Dart 支持顶级方法 (例如 main()),同时还支持在类中定义函数。 (静态函数和实例函数)。 你还可以在方法中定义方法 (嵌套方法或者局部方法)。

5,同样,Dart 还支持顶级变量,以及 在类中定义变量(静态变量和实例变量)。 实例变量有时候被称之为域(Fields)或者属性(Properties),和 Java 不同的是,Dart 没有 public、 protected、 和 private 关键字。 如果一个标识符以 (_) 开头,则该标识符 在库内是私有的 。详情请参考:  库和可见性

6,标识符 可以以字母或者 _ 下划线开头,后面可以是 其他字符和数字的组合。

7,有时候 表达式 expression 和  语句 statement 是有区别的,所以这种情况我们会分别指明每种情况。,7Dart 工具可以指出两种问题:警告和错误。 警告只是说你的代码可能有问题, 但是并不会阻止你的代码执行。 错误可以是编译时错误也可以是运行时错误。遇到编译时错误时,代码将 无法执行;运行时错误将会在运行代码的时候导致一个  异常

关键字:

qIBrier.png!web

带有上标2的都是用于异步相关特性的

对于只有一个表达式的方法,你可以选择 使用缩写语法来定义:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

这个 =>  expr  语法是 { return  expr ; } 形式的缩写。=> 形式 有时候也称之为  胖箭头  语法。

注意: 在箭头 (=>) 和冒号 (;) 之间只能使用一个  表达式 – 不能使用  语句 。 例如:你不能使用  if statement ,但是可以 使用条件表达式  conditional expression

注意:没有初始化的变量自动获取一个默认值为 null。类型为数字的 变量如何没有初始化其值也是 null,不要忘记了 数字类型也是对象。

63AnMzj.png!web

内置类型

BnuQ3mI.png!web

R前缀可以创建原始字符串

7777FjF.png!web

只有true对象才被认为是TRUE,所有其他都是FALSE

uyuuIfz.png!web

在list字面量之前添加const关键字吗,可以定义一个不变的list对象

bmu2Yb3.png!web

键值对的键只能出现一次

iQRFJr3.png!web
eYfYrmZ.png!web

方法也是对象

e2QNRjF.png!web

把方法的参数放到【】中间就变成可选位置参数了

qIBZ7rq.png!web

用=定义可选参数的默认值

bQJjYji.png!web

入口函数返回值为void或者List<String>

Zb2yuey.png!web

可以把方法赋给变量和方法

eIFneuj.png!web

Dart中最难理解的一点

fymEJv2.png!web

作用域和java作用域类似

E7nEnui.png!web

不管在何处被调用,该对象都可以访问其作用域内的变量

JRnqqeb.png!web

操作符

FrY3y2M.png!web

算术操作符

EJF36rF.png!web

递增,递减等操作

JJRNVnr.png!web

相等相关

j2QF7bI.png!web

测试是否是同一个对象,使用iedntical方法

Qz6fMrE.png!web

as类型转换

fume6jZ.png!web

赋值操作

mUzm6jb.png!web

逻辑操作

bee63aB.png!web

移位

jYFVNvU.png!web

测试是否为空

qyemYrm.png!web

级联操作符

i2YNVb6.png!web

forin遍历

bQvY7na.png!web

switch case

RBRRNrY.png!web

断言只在检查模式下运行有效,生产模式下,断言不会执行

6nYne27.png!web

rethow可以把catch的问题再抛出来

eUZZrqY.png!web

实现一个或者多个mixins

MbayeaZ.png!web

区分不同库下的文件

EviY7jj.png!web

延迟入库

ZjUnMzn.png!web

async 和 await

fYFzuqY.png!web

方法的函数体不需要使用FuFutureAPI,Dart会自动在需要的时候创建

uEz2IbQ.png!web

方法的函数体不需要使用Future API,Dart会自动创建

rQzmyev.png!web

Dart多线程

EzIr6fQ.png!web

元数据

uemUFjj.png!web

数字操作库

rUFzq2Y.png!web

radix

biqyiif.png!web

限定小数位数

ZNzUR3q.png!web

字符串和正则

7z2Qvev.png!web

从字符串中提取数据

6rie6bv.png!web

大小写转换

eAna63n.png!web

制定字符串空格

ZZZBfy3.png!web

RegExp正则表达式

AFvIzaZ.png!web

比较对象

3iEjEju.png!web

Future

eYrm2qr.png!web

dynamic用法

ZNNV7vB.png!web

final和const

u2yUZnM.png!web

Dart函数如果没有显式声明返回值,会默认为dynamic

vAZzqqn.png!web

一个表达式,可以简写

qeY7zmY.png!web

future使用方式

jqAbamU.png!web

whencomplete

YjiqMfR.png!web

wait

Rn6Bnay.png!web

使用future消除callback

eu6vAvZ.png!web

await必须出现在async函数内部

NzIZvqU.png!web

stream用于多次读取数据的异步任务


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK