简介
-
Dart 诞生于 2011 年 10 月 10 日
-
Dart 是谷歌开发的,类型安全的、面向对象的编程语言,被应用于 Web、 服务器、移动应用和物联网等领域。
-
Dart 运行方式
- 原生虚拟机: Dart 代码可以运行在 Window,Mac、Linux上。
- JavaScript 引擎 :Dart 代码可以转换成 JS 代码,运行在浏览器上。
语法基础
-
注释语法与 JS 一致
-
声明函数不需要关键字(JS 中通过 function 关键字来声明函数)
-
var 声明的变量其数据类型是动态的,对比 JS 不存在变量提升
-
打印使用 print , JS 使用 console.log
-
函数和参数前面都有类型声明
-
每行代码结束时,必须写分号
-
字符串可以通过引号包起来,支持模板字符串
-
main 是 Dart 入口函数, Dart 应用程序总是从 main 函数开始执行
// 声明函数
void hello(String value){
print('Hello $value'); // 支持模板字符串
}
// 入口函数:应用在这里开始执行
void main() {
var value='World!'; // 变量声明:使用 var 声明的变量数据类型是动态的
hello(value); // 函数调用
}
// Console:Hello World!
复制代码
注释
-
单行注释
- // 我是单行注释
-
多行注释
- / *我是多行注释 */
-
文档注释
- /// 我是文档注释
- 可以通过 dartdoc 将文档注释转成文档,文档注释支持 markdown 语法
// 我是单行注释
/* 我是多行注释 */
/// 我是文档注释 我可以被 dartdoc 转换成文档,我支持 markdown 语法
复制代码
变量
-
变量是一个引用,Dart 万物皆对象,变量存储的是对象的引用
-
变量声明
- 明确指定类型:int age = 18;
- 不明确类型:var age = 18; 或 dynamic age = 18;
-
变量名大小写敏感
-
变量默认值是 null
-
变量值不会进行隐式转换,null 不会变成 false
常量
-
常量一旦被声明,其值不可被改变
-
声明常量
- const age = 18;
- final age = 18;
-
const 和 final 的区别
- const 声明编译时能取到的值
- final 声明运行时能取到的值
void getTime() {
const time1 = new DateTime.now(); // 报错 - 无法将运行时的值分配给 const 变量
final time2 = new DateTime.now(); // 成功 - 可以将运行时的值分配给 final 变量
}
复制代码
数据类型
- Number
- num 数字类型即可以是整数,也可以是小数
- int 表示整数
- double 表示浮点数,即可以是整数,也可以是小数
void main() {
// 声明整数
int age = 18;
print('整数:${age}');
// 声明浮点数
double price = 3;
print('浮点数:${price}');
// 声明数值类型
num n1 = 3.5;
print('数值类型:${n1}');
// 类型转换
print('类型转换:${n1.runtimeType} 转换后类型:${n1.toString().runtimeType}');
// 向下取整
print('向下取整:${8.8.toInt()}');
// 四舍五入
print('四舍五入:${3.1415926.round()}');
// 返回余数
print('求余:${10.remainder(4)}');
// 数字比较 0:相同 1:大于 -1:小于
print('数字比较:${10.compareTo(10)}');
// 返回最大公约数
print('最大公约数:${12.gcd(12)}');
}
复制代码
-
String
-
声明字符串
- 可以使用单引号,双引号
- 三个引号可以声明包含换行符的字符串
-
正则表达式
RegExp(r'正则表达式'); RegExp(r'\d+'); // 匹配数字 复制代码
-
-
Boolean
- Dart 中通过 bool 关键字来表示布尔类型
- 布尔类型只有两个值:true 和 false
- 对变量进行判断时,要显示检查布尔值
-
List
-
字面量方式
List list = []; // 不限定元素的数据类型 List list = <int>[]; // 限定元素的数据类型 复制代码
-
构造函数方式
List list = new List.empty(growable:true); // 不限制长度的空列表 List list = new List.filled(3,0); // 声明指定长度的填充列表 复制代码
-
扩展操作符
var list = [1,2,3]; var list2 = [0,...list]; // [0,1,2,3] 复制代码
-
-
Set
-
Set 是一个无序的,元素唯一的集合
-
Set 有字面量和构造函数两种声明方式
-
无法通过下标取值
-
具有集合特有的操作,求交集,并集,差集等
// 字面量 var nums = <int>{1,2,2,3} // 1,2,3 // 构造函数 var fruits = new Set(); fruits.add('东瓜'); fruits.add('西瓜'); fruits.add('南瓜'); fruits.add('北瓜'); // 集合特有的操作 var caocao = new Set(); caocao.addAll(['张辽','司马懿','关羽']); var liubei = new Set(); liubei.addAll(['关羽','张飞','诸葛亮']); // 求交集 caocao.intersection(liubei); // {关羽} // 求并集 caocao.union(liubei); // {张辽,司马懿,关羽,张飞,诸葛亮} // 求差集 caocao.difference(liubei); //{张辽,司马懿} 复制代码
-
-
Map
-
Map 是一个无序的健值对 (key-value) 映射,通常被称作哈希或字典。
-
声明方式
var map = {key1:value1,key2:value2}; var map = new Map();map['key'] = value; 复制代码
-
类
- 类是通过 class 声明的代码段,包含属性和方法。
- 属性:用来描述类的变量
- 方法:类中的函数称为类的方法
- 对象是类的实例化结果
- 编程方式
- 面向对象编程(oop)
- 面向过程编程(pop)
继承
-
根据类的先后顺序,可以将类分成父类和子类
-
子类通过 extends 关键字继承父类
继承后,子类可以使用父类中可见的属性或方法
-
子类中,可以通过 @override 元数据来标记 “覆写” 方法
-
子类中,可以通过 super 关键字来引用父类中可见的内容
- 属性
- 方法(普通构造函数,命名构造函数)
class Father {
String name = '刘备';
String job;
Father(this.job);
// 命名构造函数
Father.origin(this.job);
say() {
print('Father:我是$name');
}
}
class Son extends Father {
// 通过 super 继承父类的普通构造函数
Son(String job) : super(job);
@override
say() {
print('Son:我爹${super.name}是${super.job}');
}
}
class Son2 extends Father {
// 继承命名构造函数
Son2.origin(String job) : super.origin(job);
String name = '刘永';
@override
say() {
super.say();
print('Son2:我是二儿子,我有名字,我的名字是$name,我爹是${super.name},他是${super.job}');
}
}
void main() {
var father = new Father('皇帝');
father.say();
var son = new Son('皇帝');
son.say(); // 子类当中有同名的方法调用自己的,如果没有则调用父类的方法 (覆写)
print('son:我是大儿子,我没有名字,但我继承了我爹的名字,${son.name}');
var son2 = new Son2.origin('卖草鞋的');
son2.say();
}
复制代码
资源网站
-
官网
-
在线运行代码
-
生态