哥哥带你学Dart

愷爺 · · 2533 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

概念:

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 工具可以指出两种问题:警告和错误。 警告只是说你的代码可能有问题, 但是并不会阻止你的代码执行。 错误可以是编译时错误也可以是运行时错误。遇到编译时错误时,代码将 无法执行;运行时错误将会在运行代码的时候导致一个 异常

关键字:

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

对于只有一个表达式的方法,你可以选择 使用缩写语法来定义:
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

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

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

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

内置类型
R前缀可以创建原始字符串
只有true对象才被认为是TRUE,所有其他都是FALSE
在list字面量之前添加const关键字吗,可以定义一个不变的list对象
键值对的键只能出现一次
方法也是对象
把方法的参数放到【】中间就变成可选位置参数了
用=定义可选参数的默认值
入口函数返回值为void或者List<String>
可以把方法赋给变量和方法
Dart中最难理解的一点
作用域和java作用域类似
不管在何处被调用,该对象都可以访问其作用域内的变量


操作符
算术操作符
递增,递减等操作
相等相关
测试是否是同一个对象,使用iedntical方法
as类型转换
赋值操作
逻辑操作
移位
测试是否为空
级联操作符
forin遍历


switch case


断言只在检查模式下运行有效,生产模式下,断言不会执行
rethow可以把catch的问题再抛出来
实现一个或者多个mixins


区分不同库下的文件
延迟入库
async 和 await


方法的函数体不需要使用FuFutureAPI,Dart会自动在需要的时候创建
方法的函数体不需要使用Future API,Dart会自动创建
Dart多线程
元数据


数字操作库
radix
限定小数位数
字符串和正则
从字符串中提取数据
大小写转换
制定字符串空格
RegExp正则表达式
比较对象
Future


dynamic用法
final和const
Dart函数如果没有显式声明返回值,会默认为dynamic
一个表达式,可以简写
future使用方式
whencomplete
wait
使用future消除callback
await必须出现在async函数内部
stream用于多次读取数据的异步任务

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:愷爺

查看原文:哥哥带你学Dart

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2533 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传