基础类型
number
dart 下的 number 一共有三种:int / double / num
num 相对 int, double 更加宽松,就如同 typeScript 的 number 一样。
num 类型能直接装载 int 和 double 的值,而 int 和 double 则需要 num 进行转换才能装载
// num 相对 int,double 更加宽松,就如同 typeScript 的 number 一样
int n1 = 1;
double n2 = 1.0;
num n3 = 1;
num n4 = 1.0;
// num 类型能直接装载 int 和 double 的值
num n5 = n1;
num n6 = n2;
// int 和 double 则需要转换才能装载
int n7 = n5.toInt();
double n8 = n5.toDouble();
bool
如同第一章说的,dart 内所有的类型的默认值都是 null,就算 bool 也不例外。
而且和 javaScript 不一样,在 dart 的 条件判断中,都需要使用 bool 。
bool b1; // 默认值是 null
b1 = true;
// if 内的条件一定要是 bool 值
if (b1) {}
String
dart 的 String 设置的非常简单,如果你会 javaScript ,稍微适应一下就可以了
- 基础
String s1 = "test"; String s2 = 'test'; // 拼接 String s3 = "test" + s1 + s2; // 加号拼接(能使用变量) var s4 = "test" "test"; // 空格拼接 (不能使用变量) // 转义 var s5 = "test \n test"; var s6 = r"test \n test"; // 取消转义 // 换行 var s7 = '''test1 test2 test3 '''; // 模版语法:相对 `javaScript` 不需要反引号和大括弧 var s8 = '$s1 test $s2'; - 部分 API
//部分 API var s9 = ' hello wold '; // 查找内容 s9.contains('a'); s9.startsWith('a'); s9.endsWith('b'); s9.indexOf('b'); // 替换 s9.replaceFirst("e", "b"); s9.replaceAll("e", "b"); // 截取 s9.substring(0, 2); s9.split("/"); s9.trim(); // StringBuffer .. 语法可以先忽略 var s10 = StringBuffer() ..write("312321") ..write("dsadsads") ..writeAll([32121, 321312]); - 转换
int num1 = 12; var string1 = '$num1'; var string2 = num1.toString(); // string to number int num2 = int.parse(string1); num num3 = num.parse(string1); double num4 = double.parse(string1);
date
日期类型功能非常多,相对以前用 javaScript 来说,很多日期的坑都没有了。还有很多实用的 API 可以调用。
- 创建
var d1 = DateTime(2021, 4, 2); var d2 = DateTime.now(); // 通过时间戳创建时间 var d3 = DateTime.fromMillisecondsSinceEpoch(1633097335) - 获取时间戳
var ts1 = d1.microsecondsSinceEpoch; var ts2 = d1.millisecondsSinceEpoch; - 其他
d1.add(new Duration(minutes: 5)); // 增加时间 d1.isAfter(d2); //谁在谁之后 d1.isAtSameMomentAs(d2); // 是否相同时间 var diff = d1.difference(d2); // 获取两个时间点的之间的时间段
enum
枚举没什么好说的,不过写习惯了 swift 的话,可能会觉得很憋屈,很多神奇的功能都没有了,只是一个简单的枚举类型
enum Status { loading, success, error }
List / Map / Set
从 javaScript 类比一下, List 就是数组,而 Map 和 Set 则和 ES6 的 map 和 set 意义差不多。一个是 key-value 的数据结构,一个是不可重复的数组。这三个集合类型我们都按照,定义 - 增删改查 - 重要属性和方法 的模式来学习。
主要说一下需要注意的几点:
- 三者的创建都能指定类型,如同
List<int>,Map<String, String>()和Set<int>()。这种是泛型是使用,后面会专门说一下泛型。 List初始化的时候是分 固定长度 和 不固定长度 的。
// List
// 1. 定义
List list1 = []; // 不固定长度
List list2 = List.filled(5, 0); // 固定长度
List<int> list3 = []; // 指定类型
// 2. 增删改查
list3.add(1);
list3.add(2);
list3.add(3);
list3.insert(3, 4);
list3.insertAll(4, [5, 6]);
list3.removeAt(0); // 按照位置删除删除第一个
list3.remove(2); // 按照内容删除
// list3.clear() //删除所有
list3[0] = 11;
var index = list3.indexOf(11); // 查询
print(list3);
//3. 重要属性和方法
// 排序
list3.sort();
print(list3);
// 合并
var ls = list2 + list3;
print(ls);
// 属性
print(ls.first);
print(ls.last);
print(ls.length);
print(ls.reversed);
print(ls.isEmpty);
print(ls.isNotEmpty);
// Set 和数组差不多,但是不会有重复值
// 1. 定义
// var s = Set();
var s = Set<int>(); //限制类型的
// 2. 增删
s.add(1);
s.add(2);
s.add(3);
s.add(1); // 重复的值不会再添加
s.remove(1);
// s.removeAll([2, 3]);
// s.clear();
print(s);
var s1 = Set();
s1.add(2);
s1.add(3);
s1.add(4);
//3. 重要属性和方法
// 交集:两个 Set 都有的值会重新组合成一个 set
var s2 = s1.intersection(s);
print(s2);
// 合并: 两个 Set 合并
var s3 = s1.union(s);
print(s3);
// Map
// 1. 定义
// var m = Map();
var m = Map<String, String>();
// 2. 增删改查
m['name'] = "testName";
m.addAll({"local": "shenzhen"});
m.addAll({"test": "value"});
m.remove("local");
m.removeWhere((key, value) => key == 'name');
// m.clear();
m.update("name", (value) => "test2");
m.updateAll((key, value) => "($value)");
// 3. 重要属性和方法
print(m.isEmpty);
print(m.isNotEmpty);
print(m.length);
print(m.keys);
print(m.values);