前言 为什么学习Dart?
Dart
语法简洁高效,拥有数以千计的packages 生态系统Dart
提供提前编译优化,以在移动设备和 web 上实现可预测的高性能和快速启动Dart
可以编译成 ARM 和 x86 代码,因此 Dart 移动应用程序可以在 iOS,Android 及 更高版本上实现本地运行。 对于 web 应用程序,Dart
可以转换为 JavaScript
4.Dart
是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉。 如果您有一定的面向对象编程语言的基础 ,那么使用 Dart
也就是分分钟的事情
5.Dart
可以便捷的进行响应式编程。由于快速对象分配和垃圾收集器的实现, 对于管理短期对象(比如 UI 小部件), Dart
更加高效。 Dart
可以通过 Future 和 Stream 的特性和API实现异步编程。
- 同时也为
Flutter
学习打下一定的基础
二. 语言特点
1. Dart
是一门纯粹的面向对象语言,在Dart
中一切皆对象;函数(函数可以作为参数传递),字符串,数字等都是对象。
如下代码,数字可以调用对象方法
var text = 666.toString();
print(text);
函数作为对象传递
var list = [1, 2, 3];
printEle(element) {
print("输出值 is $element");
}
list.forEach(printEle);
系统函数
forEach
参数要求传一个函数
/**
* Applies the function [f] to each element of this collection in iteration
* order.
*/
void forEach(void f(E element)) {
for (E element in this) f(element);
}
2. Dart
是一门强类型语言(js是一门弱类型语言),但也支持一些弱类型特性如:var
、object
、dynamic
等;
var
实际上是编译器语法糖,声明变量后会自动推导类型,不可更改赋值类型dynamic
表示动态任意类型,可以赋值任意类型,编译阶段不检测类型,被编译后是object
类型object
表示动态任意类型,可以赋值任意类型,编译阶段检查类型测试以下代码(可以打开注释,方便理解)*
var p1 = 1;
Object p2 = 2;
dynamic p3 = 3;
//p1 = 'A';编译期会报错;A value of type 'String' can't be assigned to a variable of type 'int'.
// p1 = 'A';
// p2,p3改变类型不会报错,因为都表示任意类型
p2 = 'B';
p3 = 'C';
//p2 因为Object编译期会检查类型,发现p2没有未定义 run函数 而报错 ;The method 'run' isn't defined for the type 'Object'.
// p2.run();
//p3 dynamic编译器不检测类型,不会报错,运行时抛出异常;NoSuchMethodError: Class 'String' has no instance method 'run'.
p3.run();
print(p1);
print(p2);
print(p3);
- 兼具编译性语言特点和解释性语言特点
- 对开发web应用来讲:dart会被转译成js
- 对app、服务端、桌面应用讲:dart提供了开发模式,通过vm解释执行,支持热更新,具有解释型语言特点;也提供了生产模式,通过编译成机器码执行,具有编译型语言特点
三.开始学习吧
1. Dart
支持以下基本数据类型:
- Numbers
- Strings
- Booleans
- List(数组)
- Maps(字典键值对)
2. 变量声明:
- 可以显示声明指明类型,方便编译器做一些静态检查如:
int age = 18;
- 可以
var
声明类型,变量初始化后自动推导类型,并且不可更改赋值类型
var p1 = 1;
注意以下写法也是正确的:
var name;
name = "无名氏";
name = 18;
name.run();
print(name);
声明时不赋值则等同于声明了一个动态类型(dynamic)变量
-
static final const
关键字
-
static
:用于修饰成员变量,这个变量是属于类的,而不是属于对象的,除此之外没有其他别的含义了 -
final
修饰的变量不许进行初始化,赋值之后不能再改变;编译期和运行期确定值都可以 -
const
修饰变量,必须进行初始化,赋值之后不能再改变,该变量必须编译器就确定,否则会报错
getInfo() {
return "个人信息";
}
const name = "我爱学习啊";
//报错,因为编译期间不能确定info值;Const variables must be initialized with a constant value.
const info = getInfo();
final name1 = "我也爱学习";
//不报错
final info1 = getInfo();
const
还可以用来构造对象;表明该对象在编译期就能够完全确定,所以该对象类所有属性都必须使用final 或者 const
修饰,也就是说该对象所有属性都是不能改变的既该对象是不可变的;
void main() {
People p = const People("flutter");
}
class People {
final name;
const People(name) : this.name = name;
}
如果对象类属性不适用final修饰,则该对象某个属性是可变的,那么该对象就不能被称为是不可变的,所以会报错;
void main() {
People p = const People("flutter");
}
class People {
final name;
//也可以
static const height = 180;
int age;
//Can't define a const constructor for a class with non-final fields.
const People(name) : this.name = name;
}
const
构造集合,说明该集合完全不可变,类似OC中不可变集合;
const array = const [1, 2, 3];
array[0] = 0;
//运行时报错;Unhandled Exception: Unsupported operation: Cannot modify an unmodifiable list
print(array);
相同的
const
变量,内存中只会创建一次
var list1 = const [1, 2, 3];
var list2 = const [1, 2, 3];
//判断是否指向同一个对象
bool result = identical(list1, list2);
if (result) {
print("是同一个对象");
} else {
print("不是同一个对象");
}
输出flutter: 是同一个对象
- 变量未初始化的默认值:
在Dart中未初始化变量都为null,null也是Object子类
var name;
int age;
Object people;
List list;
dynamic dy;
print(name);
print(age);
print(people);
print(list);
print(dy);
全输出null
5.类型判断:
a is Object
去判断
//输出 true
print(null is Object);
//输出 true debug下输出,release忽略
assert(null is Object);
- 类型转换:
Dart
是强类型语言,所以需要显示转换。常见的转换:
String aa = "111";
//String-> int
int bb = int.parse(aa);
// int -> double
double cc = bb.toDouble();
// String -> double
double dd = double.parse("1.1");
// num -> String
aa = cc.toString();
//double指定位数 ->String
String ee = 3.141592.toStringAsFixed(3); //结果为3.141