Dart 入门

一. 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();
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容