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的官方教程和文章都写得通俗易懂,个人认为是学习Dart的最好资料。本帖将它们进行收集整理,方便新手查阅:
语言
- Language Tour, 讲解语言基础 - https://www.dartlang.org/guides/language/language-tour
- Library Tour, 讲解标准库 - https://www.dartlang.org/guides/libraries/library-tour
- Effective Dart,讲解编码最佳实践 - https://www.dartlang.org/guides/language/effective-dart
- Futures, 讲解异步编程之Futures - https://www.dartlang.org/tutorials/language/futures
- Streams, 讲解异步编程之Streams - https://www.dartlang.org/tutorials/language/streams
- Sound Dart, 讲解Dart的类型系统 - https://www.dartlang.org/guides/language/sound-dart
- Dart API文档 - https://api.dartlang.org/
工具
- Pub即Dart包管理器入门 - https://www.dartlang.org/tools/pub/get-started
- 定制Dart静态分析 - https://www.dartlang.org/guides/language/analysis-options
Web / AngularDart
- Angular Dart入门 - https://webdev.dartlang.org/guides/get-started
- Angular Dart之英雄指南 - https://webdev.dartlang.org/angular/tutorial
VM / 服务端
- Dart VM之命令行应用 - https://www.dartlang.org/tutorials/dart-vm/cmdline
- Dart VM之Http应用 - https://www.dartlang.org/tutorials/dart-vm/httpserver
Flutter / 移动端
- Flutter官方文档 - https://flutter.io/docs/
- Flutter中文资源站 - https://flutter-io.cn/
Dart开发环境
Dart SDK的安装
- windows平台:choco install dart-sdk
- Linux平台:sudo apt-get install dart
- Mac平台:brew install dart - - devel
Dart官方地址:https://www.dartlang.org/guides/language/language-tour?from=yoytang.com
Dart IDE的安装
- Intellij IDEA、Android Studio
- VS Code
- Sublime Text、Atom
Dart 插件的安装
- 在线安装
- 离线安装
离线安装需要注意IDE版本和插件版本对应
Dart语言入门
变量和常量
用final修饰的变量,必须在定义时将其初始化,其值在初始化后不可改变;const用来定义常量。
它们的区别在于,const比final更加严格。final只是要求变量在初始化后值不变,但通过final,我们无法在编译时(运行之前)知道这个变量的值;而const所修饰的是编译时常量,我们在编译时就已经知道了它的值,显然,它的值也是不可改变的。
int Func() {
// 代码
}
final int m1 = 60;
final int m2 = Func(); // 正确
const int n1 = 42;
const int n2 = Func(); // 错误
Dart中的数据类型
- 数值型-Number
1.num
int
double
2.数值型操作
运算符 :+ - * / ~ / %
常用属性:isNaN、isEven、isOdd等
常用方法:sbs()、round()、floor()、ceil()、toInt()、toDouble()
- 字符串型-String
1.字符串创建
使用单引号,双引号创建
使用三个引号或双引号创建多行字符串
使用r创建原始raw字符串
2.字符串操作
运算符:+、*、==、[ ]
插值表达式:${expression} 只有一个变量可以省略{ }
常用属性:length、isEmpty、isNotEmpty
常用方法:contains(),subString(),toLowerCase(),toUpperCase(),startsWith(),endWith(),
trim(),trimLeft(),trimRight(),indexOf(),lastIndexOf(),replaceXXX() - 布尔型-Boolean
使用bool表示布尔类型
值true和false - 列表-List(数组)
dart中List和数组是同一个概念
1.List的创建:
var list = [1,2,3,“start”,true];(可以存储不同类型)
var list = const[1,2,3];(不可变)
var list = new List();
2.常用操作:
[],length,indexOf(),lastIndexOf(),add(),insert(),sort(),sublist(),remove(),clear(),shuffle(),asMap(),
forEach() 如何将方法作为一个参数,forEach接受一个方法 - 键值对-Map
1.创建map:
var language = {‘first’:‘dart’,‘second’:‘java’};
var language = const {‘first’:‘dart’,‘second’:‘java’};
var language =new Map();
2.常用操作:
[],length,containsKey(),containsValue(),inEmpty(),isNotEmpty(),remove();keys,values,forEach() - dynamic 动态类型
- Runes、Symbols
Dart中的运算符
- 算术运算符
加减乘除:+,-,*,/,~/,%
递增递减:++var ,var++,–var,var– - 关系运算符
运算符:==,!=,>,<,>=,<=
判断内容是否相同 ,与java不同判断字符串内容是否相等也用 == - 逻辑运算符
运算符:!,&&,|| 针对布尔类型运算 - 赋值运算符
基础运算符:=,??= 本身有值无效,无值才赋值
复合运算符:+=,-=,*=,/=,%=,~/= - 条件表达式
三目运算符:condition?expr1:expr2
??运算符:expr1??expr2
Drat中的控制流 - if语句
if语句
if…else if 语句
if…else if …else语句 - 循环语句
for循环
for…in
while循环
do…while循环
break
continue - switch…case语句
比较类型:num,string,编译期常量,对象,枚举
非空case必须有一个break
default处理默认情况
continue跳转标签
Dart中的方法 - 方法的定义:
- 方法特性
方法也是对象,并且有具体类型Function
返回值类型、参数类型都可以省略
箭头语法:=>expr是{return expr;}缩写。只适用于一个表达式
方法都有返回值,如果没有指定,默认return null 最后一句执行
getPerson(name,age){
return "name= $name,age= $age";
}
//等同于
getPerson(name,age)=> "name= $name,age= $age";
//表达式
int gender = 2;
getPerson(name,age)=> gender==1?"name= $name,age= $age":"test";
- 可选参数
可选命名参数:{param1,param2,…}
void main(){
printPerson("张三")
printPerson("李四",age:20)
printPerson("李四",age:20,gender:"male")
printPerson("李四",gender:"male")
}
printPerson(String name,{int age,String gender}){
print("name=$name,age=$age,gender=$gender")
}
可选位置参数:[param1,param2,…]
void main(){
printPerson("张三")
printPerson("李四",20)
printPerson("李四",20,"male")
}
printPerson(String name,[int age,String gender]){
print("name=$name,age=$age,gender=$gender")
}
如果存在具体参数,可选参数声明必须在参数后面
- 默认参数值(基于可选参数,如果没有赋予默认参数值,value为null)
使用 = 在可选参数指定默认值
默认值只能是编译时常量
printPerson(String name,[int age = 10,String gender = "male"]){
print("name=$name,age=$age,gender=$gender")
}
- 方法对象(function)
方法可作为对象赋值给其他变量
void main(){
//var func=printHello
Function func=printHello
func();
}
void printHello(){
print("Hello")
}
方法可以作为参数传递给其他方法
void main(){
var list = ["H","e","l","l","o"];
print(listTimes(list,times));
}
List listTimes(List list,String times(str)){
for(vat index = 0;index < list.length;index++){
list[index] = times(list[index]);
}
return list;
}
String times(str){
return str*3;
}
- 匿名方法
定义
(参数1,参数2,...){
方法体
return 返回值
}
匿名方法特性(也就是作为一个对象的特性)
可赋值给变量,通过变量进行调用
void main(){
vat func = (str){
print("Hello---$str")
}
func(30);
}
//不推荐用法,括号调用
((){
print("test");
})()
可在其他方法中直接调用或传递给其他方法
void main(){
//这个和上面执行结果是一样的
listTimes(list,(str){return str*3});
//或者不作为参数,作为变量在方法内部使用
List listTimes(List list){
var func = (str){return str*3};
for(vat index = 0;index < list.length;index++){
list[index] = func(list[index]);
}
return list;
}
}
- 闭包
闭包是一个方法(对象)
闭包定义在其他方法内部
闭包能够访问外部方法内的局部变量,并持有其状态(闭包的主要作用,访问方法里的局部变量)
void main(){
var func = a();
func();
func();
func();
}
a(){
int count = 0;
//printCount(){
//print(count ++);
//}
//更多的时候使用匿名方法
return (){
print(count ++);
};
}