介绍
Dart是什么?
Dart是一门新的编程语言,如同JAVA、PHP一样,是为了解决编写应用程序中的一些实际问题而被造轮子发明出来的,而这个造轮子的人就是 Google。可能大家都熟悉Google 的另一个轮子Golang,而对 Dart 听闻甚少,其实Dart 的出生跟Go很相近,只是由于它的星途比起Go来说有点坎坷,一直没有被广大开发者重视,相关的技术文章和应用比较匮乏,也就一直蒙尘在泛泛语言之中。
使用 Dart 可以做什么?
登录 Dart 的官网,你可以很清楚的看到 Dart 的创作者将 Dart 明确的分成了三个方向: 移动开发、DartVM 命令行程序(Server 端)、浏览器(前端)。
没基础不要紧张
对于没有基础的同学也不要紧张,咱也是最近开始学。学习过 JavaScript
或者 Java/Kotlin
的人,在学习 Dart
上几乎是没什么难度的,Dart 综合了动态语言和静态语言的特性,尽管Dart是强类型的,但类型声明是可选的,因为Dart可以推断类型
变量的声明
注意:未初始化的变量的初始值为 null,即使是数字类型的变量,最初也是 null,因为数字在Dart中都是对象。一切皆对象 null 也是对象 在线运行Dart代码
var name = "zhangsan"; // 隐式声明(变量的类型会自动推断)
// 通过指定类型的方式
String name = "zhangsan"; // 显示声明
Object name = "zhangsan"; // 通用对象声明
dynamic name = "zhangsan"; // 动态对象声明,这里dynamic和Object是等价的,二者钧可被赋值为其他类型的对象
final name = "zhangsan"; // 不可变对象
...
修饰符 static final const
static
用于修饰成员变量,这个变量是属于类的,而不是属于对象的,除此之外没有其他别的含义了 static 修饰符的使用方式和 Java 类似。 static 变量直到运行期被使用时才会实例化
final
用于修饰变量,表示单赋值(single-assignment),使用 final 修饰的变量必须进行初始化,一旦被赋值之后,不能够再次被赋值,否则编译会报错
final name = "zhangsan"; // 正确
name = "lisi"; // 错误
const
Dart 中 const 是用来修饰某个值的
var list = const [1,2,2,3,4]; // 正确
var list = [1,2,3,4]; // 正确(使用const赋值声明,const可省略)
// const需要是编译时常量
const time = new DateTime.now(); //错误
final 和 const 的共同点:
声明的类型可以省略 - 初始化后不能再赋值 - 不能和var一起使用
更多详情请查阅 官方文档
内置类型
Number 数值
int 和 double 是 Numbers
的子类:
int testInt = 18; // int 整数值
double testDouble = 2.0 // 64-bit 双精度浮点数
String 字符串
-
Dart 字符串是UTF-16编码的字符序列,可以使用单引号或者双引号来创建字符串
-
可以使用三个单引号或者双引号创建多行字符串对象
-
可以使用 r 前缀创建 "原始raw" 字符串
-
可以在字符串中使用表达式: ${expression}, 如果表达式是一个标识符,可以省略 {},如果表达式的结果为一个对象,则 Dart 会调用对象的
toString()
函数来获取一个字符串
String testString1 = 'string 1';
String testString2 = "string 2";
String testString3 = '''
String 1
String 3
''';
String testString4 = r'String 4\n String 5';
class Expression{
String getString() => 'getString';
@override
String toString() {
return 'This is in getString class';
}
}
void main() {
var expression = new Expression();
print(expression);
print('String: ${expression.getString()}'); // getString
}
Boolean 布尔值
bool 这个类型有些特殊,在 Java 中未定义是 false,而在 Dart 里 bool 对象未初始化的默认是 null
bool status;
print(status); // null
List 列表(数组)
-
Dart 中可以直接打印 List 包含 List 的元素,List 也是对象。Java 中直接打印 List 结果是地址值
-
Dart 中 List 的下标索引和 Java 一样从0开始
-
和 Java 一样支持泛型
List<String> arrList;
-
有增删改查、支持倒序、自带排序、洗牌,可以使用 + 将 两个 List 合并
List a = [1, 2, 3]; List b = [4, 5, 6]; List c = a + b; print(c); // [1, 2, 3, 4, 5, 6];
Map 集合(字典)
和 Java 类似,映射是无序的键值对。常用的两种定义方式
var test = Map();
var test2 = {
"a": "b",
"c": "d"
};
Map 的 key 和 value 类型是可以指定的
var test3 = Map<int, String>();
test3[1] = "map 1"; // 正确
test3["2"] = "map 2"; // 错误,类型不正确
注意:key 必须是唯一的
Set 集合
Set 是没有顺序且不能重复的集合,所以不能通过索引去获取值
var test = Set();
test.add(1);
test.add(1); // 重复元素无效
Runes 符号字符
Runes 是 UTF-32
编码的字符串。它可以通过文字转换成符号表情或者代表特定的文字
Runes runes = Runes('\u{1f605} \u6211');
var str = String.fromCharCodes(runes);
print(str); // 😅
Symbol 标识符
这个更不常用。Symbol 标识符,主要是反射用,现在 mirrors 模块已经被移除
类型转换与操作符
数值 和 字符串 相互转换的方法
字符串转整数使用 int.parse()
String testString = '1234';
int testInt = int.parse(testString);
字符串转浮点数使用 double.parse()
String testString = 123.123;
double testDouble = double.parse(testString);
数值转字符串使用 toString()
int testInt = 1234;
String testString = testInt.toString();
操作符
描述 | 运算符 |
---|---|
后缀操作 | expr++ expr-- () [] . ?. |
前缀操作 | -expr !expr ~expr ++expr --expr |
乘除 | * / % ~/ |
加减 | + - |
位移 | << >> |
按位与 | & |
按位异或 | |
按位或 | | |
类型操作 | >= > <= < as is is! |
想等 | == != |
逻辑与 | && |
逻辑或 | || |
是否为空 | ?? |
三目运算 | expr1 ? expr2 : expr3 |
级联 | .. |
赋值 | = *= /= ~/= %= += -= <<= >>= &= ^= |
一些基本实例:
a++
a--
a + b
a = b
c ? a : b
a is T
if (n % i == 0 && d % i == 0)
if (n % i == 0 || d % i == 0)
2 + 3 == 5
2 - 3 == -1
2 * 3 == 6
5 / 2 == 2.5 // 结果是double类型
5 ~/ 2 == 2 // 结果是一个整数
5 % 2 == 1 // 余数
2 == 2 // true
2 != 3 // true
3 > 2 // true
2 < 3 // true
3 >= 3 // true
2 <= 3 // true
b ??= value // 如果b为空,则将值分配给b;否则,b保持不变
a *= 3 // 赋值且相乘 a = a * 3
.....