一. Dart开发环境的配置
Dart SDK Install
官方文档
https://webdev.dartlang.org/guides/get-started
此处指说明在Mac上的环境搭建
安装Dart SDK
> brew tap dart-lang/dart
> brew install dart
Dart IDE Install
此处推荐的IDE为 VSCode, WebStorm, Intellij IDEA, Android Studio.
Dart Plugin Install
VS Code 中安装Dart language plugin
Android Studio 中安装Dart language plugin
二. Dart开发入门
// 函数入口
void main () {
print("This is Carson");
}
三. Dart变量类型
var 声明变量, 当未初始化的时候, 变量值为null;
var a = 10;
使用关键字 final声明的变量只能赋一次值
final b = "Hello world!"
使用关键字const来修饰常量
const c = "Hi there!";
const修饰的常量与final修饰的变量的区别为 const修饰的常量必须为编译阶段就知道的常量例如不会改变的常量字符串,整型值等.
四. Dart数据类型
Dart内置的数据类型 数值型-num 字符型-String 布尔型-Boolean 列表型-List 键值对-Map
此外还有 Runes, Symbols
// num类型有两种 Int与double类型
num a = 123;
int b = 123;
double = 123.12;
// 数值型操作
// 运算符 + - * / %
// 特别注意的是 ~/ 这个 为取整
// 常用属性 isNaN
// 常用方法
// abs()绝对值
// isEven()为偶数
// isOdd()为奇数
// 以下double类型的方法
// floor()为不大于其的最小整数
// ceil()为不小于其的最小整数
// round()为四舍五入
// 字符串类型
String str0 = "Hello";
String str1 = 'World';
String str2 = '''Hello
world''';
// 字符串类型可以为"" '' ''''''来表示
String str3 = 'hello \n world';
String str4 = r'hello \n world'; // 等价于'hello \\n world';
// 转义\n
// 字符串常用方法
String str5 = str4.toUpperCase(); // 转为大写字母字符串
String str6 = str4.toLowerCase(); // 转为小写字母字符串
print(str6 * 5); // 为str6字符串 *5次打印
print(str5 == str6); // == 为字符串比较是否相等
print(str5[0]); // 根据对应的下标取出对应的字符
// 插值表达式: ${expression}
int z = 3;
int y = 5;
print("a + b = ${z + y}");
// 输出为 a + b = 8;
print("a = $z");
// 输出为 a = 3;
print(str6.isEmpty); // 判空
print(str6.isNotEmpty); // 判断是否不是空字符串
print(str6.length); // 截取长度
print(str6.isEmpty); // 判空
print(str6.isNotEmpty); // 判断是否不是空字符串
print(str6.length); // 截取长度
print(str6.contains("A")); // 是否包含字符
print(str6.indexOf("D")); // "D"在字符串中的下标
print(str6.lastIndexOf("D")); // "D"在字符串中的反取下标
print(str6.substring(2)); // 下标2开始截取出剩余的字符串
print(str6.substring(2, 4)); // 下标2开始至下标4截取出剩余的字符串
print(str6.startsWith("A")); // 是否为"A"开头的字符串
print(str6.endsWith("C")); // 是否为"C"开头的字符串
print(str6.trim()); // 截取字符串前后空格
print(str6.trimRight()); // 截取字符串右边空格
print(str6.trimLeft()); // 截取字符串左边空格
String str7 = "1 3 2 3 4";
var list = str7.split(" "); // 通过" "字符分割str7字符串为数组
// 布尔型
bool isTrue = true;
bool isFalse = false;
// List(数组)
var list = [1,2,3,4,1]; // 数组创建
var cList = const [1,23,123,1]; // 不可变数组创建(即数组中不同的元素不可以被更改)
var newList = new List(); // 类构造的方式创建List
// 常用的操作方式
newList.add(1); // 添加元素
newList.indexOf(1); // 元素在数组中的下标
newList.insert(0, "123"); // 在固定的下标插入元素
newList.remove(1); // 删除数组中的元素
newList.removeAt(0); // 删除指定下标的元素
newList.clear(); // 清空数组中所有元素
newList.indexOf(1); // 获取1在数组中的下标
newList.lastIndexOf(1); // 获取1在数组中倒序下标
newList.sort(); // 排序数组
newList.sublist(0); // 从哪个下标开始获取子List
newList.shuffle(); // 打乱数组(洗牌算法)
newList.asMap(); // 转换为Map
newList.forEach(print); // print为一个Method此处为遍历数组并打印
// Map (Key Value 键值对)
var map = {'first': 1, 'second':2 }; // 创建可变Map
var cMap = const {'first': 1, 'second':2, 'third':3 }; // 创建静态Map
var newMap = new Map(); // 类构造方法创建Map
print(map.keys); // Map中所有的Keys List
print(map.values); // Map中所有的values List
print(map.length); // Map的长度
print(map.isNotEmpty); // Map是否不为空
print(map.isEmpty); // Map是否为空
print(map.containsKey("first")); // Map是否包含此"First"的Key值
print(map.containsValue(1)); // Map中是否包含1的value值
map.remove("first"); // Map中移除key为"first"的键值对
List arr = [12,123,123,123,12321,213123];
Map tMap = arr.asMap(); // 将List转换为Map
// dynamic类型(类似于泛型, 可以为动态类型)
var list = new List<dynamic>();
list.add("1");
list.add(12);
list.add(true);
五. 运算符
// 数据运算符
int a = 13;
int b = 12;
print(a + b); // 加
print(a - b); // 减
print(a * b); // 乘
print(a / b); // 除
print(a % b); // 取余
print(a ~/ b); // 取整
print(++a); // 加完再用
print(a++); // 先用再加
print(--b); // 减完再用
print(b--); // 先用再减
// 关系运算符
// == 等于 判断内容相等
// != 不等于
// > 大于
// < 小于
// >= 大于等于
// <= 小于等于
// 逻辑运算符
// !
// &&
// ||
// 针对布尔值的运算
// 赋值运算符
// =
// ??= 当变量值不存在的时候,为变量赋值=后方的值
// 复合运算符 (以下均为变量与右侧值进行运算将结果赋值左侧变量)
// +=
// -=
// *=
// /=
// %=
// ~/=
// 条件表达式
// 三目运算
int res = 3 > 2 ? 3:2;
// ?? 表达式 ??前值为null是则赋值??后的值
int value1 = 10;
int value2 = value1 ?? 4;
六.控制流语句
// 条件语句
// if 条件语句
String gender = "Male";
if (gender == "Male") {
print("Male");
} else {
print("Female");
}
// switch case 语句
int score = 90;
switch (score) {
case 100:
{
print("Perfect!");
}
break;
case 90:
{
print("Normal");
}
break;
default:
}
// 循环语句
// for循环
var newList = [1,2,3,1,23,2,32,3];
for (int i = 0; i < newList.length; i++) {
print(newList[i]);
}
for (var item in newList) {
print(item);
}
// while循环
int i = 100;
while (i-- > 0) {
print(i);
}
// do while循环
int j = 100;
do {
print(j);
} while (j-- > 0);
// break 终止所在的循环
// continue 跳出当前循环
// switch case 语句
// Dart 中的Switch...case语句,
// 比较的类型可以为num,String,编译期常量,对象,枚举
// 非空的case必须要有break关键字
// continue关键字可以切换跳转执行语句
int score = 90;
switch (score) {
A:
case 100:
{
print("Perfect!");
}
break;
case 90:
{
print("Normal");
continue A;
}
break;
default:
}
七. 方法定义
// 方法定义
// 与其他语言一致, 需要有方法名, 返回值类型, 形参类型, 方法体;
String getPersonName() {
return "Carson";
}
// 方法特性
// 方法也是对象,并且有具体类型的Function
// 返回值类型,参数类型都可以省略
// 箭头语法: => expr是{ return expr;}缩写.只试用一个表达式
// 方法都会有返回值
getPersonAge(age) {
print(age);
}
// 箭头语法声明方法
getPersonSex (sex) => "sex=$sex"; // 此方法为返回值字符串
// 可选参数(注:可选参数的命名必须在必填参数之后)
// 可选命名参数 {param1,param2,...}
getPerson1(name, {age, gender}) {
print("name=$name, age=$age, gender=$gender");
}
// 方法调用
getPerson1("Carson");
getPerson1("Carson", age: 12);
getPerson1("Carson", age: 12, gender: "Male");
// 可选位置参数 [param1,param2,...]
getPerson2(name, [age, gender]) {
print("name=$name, age=$age, gender=$gender");
}
// 方法调用
getPerson2("Carson");
getPerson2("Carson", 12);
getPerson2("Carson", 12, "Male");
// 默认参数
// 使用"="进行赋值,但是赋值必须是编译期的常量
getPerson3(name, {age = 25, gender = "Male"}) {
print("name=$name, age=$age, gender=$gender");
}
// 方法调用
getPerson3("Carson");
getPerson3("Carson", age:26);
getPerson3("Carson", age:27, gender:"Male");
// 方法重命名
Function func = printHello;
// 方法重命名之后的调用
func();
// 方法可以作为参数进行传递
List getNewList(List list, String times(str)) {
for (var i = 0; i < list.length; i++) {
list[i] = times(list[i]);
}
return list;
}
String times(str) {
return str * 3;
}
var list = ["2","1","23","123","123"];
// 方法调用
print(getNewList(list,times));
// 匿名方法
// 可赋值给变量,通过变量进行调用
// 可在其它方法中直接调用或者传递给其他方法
var funcA = () {
print("Hello");
};
// 方法调用
funcA();
// 方法调用
(() {
print("Hello2");
})();
// List与Map借助匿名函数进行循环
var list2 = ["2","1","23","123","123"];
list2.forEach((item){
print(item);
});
var map2 = list2.asMap();
map2.forEach((key, value) {
print("key=$key, value=$value");
});
// 闭包
// 闭包是一个方法(对象)
// 闭包定义在其它方法内部
// 闭包能够访问外部方法内的局部变量,并持有其状态
// 声明方法并return出去
func1() {
int count = 0;
printCount() {
print(count++);
}
return printCount;
}
// 声明匿名方法并进行return
func2() {
int count = 0;
return () {
print(count--);
};
// 闭包的调用
var funct1 = func1();
funct1();
var funct2 = func2();
funct2();