Dart
由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言。
类似JavaScript,Dart也是一种面向对象语言,但是它采用基于类的编程。它只允许单一继承,语法风格接近C语言。
Dart安装
无论是什么操作系统,安装方式都是有两种:通过工具安装和直接下载SDK,配置环境变量 .
我是在https://dart.dev/tools/sdk/archive这个网站里下载适合自己电脑的版本,然后配置环境变量的,(在终端中输入dart --version,看到版本号表示成功安装)另外 编辑器是VSCode 安装的Dart插件,进行的文件编写
注意:文件扩展名 .dart,在终端运行文件是dart + 文件名即可(为了方便运行我在vsCode中加入插件Code Runner)
Dart入门
1.类似于C语言,入口是mian函数(函数无返回值)
2.在dart打印内容是 print()
入门:
创建helloDart.dart文件
main(List<String> args) {
print('Hello Dart');
}
打开终端,运行 dart helloDart.dart 看到打印出Hello Dart,表示运行成功
Dart语法
一、变量的声明
dart是强类型语言,变量有自己的类型
- 明确声明:类型 变量名称 = 赋值
String name = 'hello Dart';- 类型推导 (通过关键字var /const/final/dynamic)
var name = 'hello Dart'
const name2 = 'hello Dart'
final name3 = 'hello Dart'
注意:
var 声明的类型是可改值的
const不可重新赋值
final 不可重新赋值
区别:final可以运行时赋值 ;const必须直接赋值常量
- 关键字dynamic 声明的变量类型可以更改
dynamic bar = 'abc';
bar = 124;
- 输入代码后,发现居然没有报错。原因:通过类型推导,bar已经定义为String类型,但是由于前面关键字是dynamic,表示变量时动态的,可变的,所以之后bar可以重新赋值,改变这个变量的类型也不会报错的
二、数据类型
2.1. 数字类型
整数用 int,浮点数用 float
// 1.整数类型int
int num = 123 ; //10进制
num = 0x123; //16进制
//2.浮点类型double
double a = 3.14
字符串和数字之间的转化:
// 字符串和数字转化
// 1.字符串转数字
var one = int.parse('111');
var two = double.parse('12.22');
print('${one} ${one.runtimeType}'); // 111 int
print('${two} ${two.runtimeType}'); // 12.22 double
// 2.数字转字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String
2.2. 布尔类型
值为true和false
// 布尔类型
var isFlag = true;
print('$isFlag ${isFlag.runtimeType}');
注意: Dart中不能判断非0即真, 或者非空即真
var msg = 'aa';
// 错误的写法
if (msg) {
print(msg)
}
//正确的写法
if (msg != null) {
print(msg)
}
2.3. 字符串类型
单、双、三引号包裹的
// 1.字符串定义方式
var msg = "aaa";
var msg2 = 'bbb';
var msg3 = '''
a
b
c
''';
字符串和其他变量或表达式拼接: 使用${expression}, 如果表达式是一个标识符, 那么{}可以省略
// 2.字符串的拼接(${变量})
final name = "hello";
// 什么情况下可以省略{}
// 比如$直接跟一个变量
print("${name}");
print("$name");//可以省略
// 不能省略
// 比如{}是表达式
print("${name.runtimeType}");//String
print("$name.runtimeType");//hello.runtimeType
2.4.集合类型
定义方式
- List定义
// 1.List类型 [元素1,元素2,...]
List<String> letters=["a","b","c"];
2.Set定义
// 2.Set类型 {元素1,元素2,...}
// 开发中应用少,一般用在对List 去重
Set<int> nums= {1,2,3,1};
// print(nums);//{1,2,3} 发现重复的数字1只保留了一个
3.Map定义
// 3.Map类型(key,value) {key1:value1,key2:value2,......}
Map<String,dynamic> info= {
"name":"lmm",
"age":18
}
集合常见操作
Lists里面常用的属性和方法:
| 常用属性: | |
|---|---|
| length | 长度 |
| reversed | 翻转 |
| isEmpty | 是否为空 |
| isNotEmpty | 是否不为空 |
| 常用方法: | |
|---|---|
| add | 增加 |
| addAll | 拼接数组 |
| indexOf | 查找 :传入具体值 |
| remove | 删除:传入具体值 |
| removeAt | 删除:传入索引值 |
| fillRange(startIndex,endIndex,fillvalue) | 修改 |
| insert(index,value); | 指定位置插入 |
| insertAll(index,list) | 指定位置插入List |
| toList() | 其他类型转换成List |
| join() | List转换成字符串 |
| split() | 字符串转化成List |
| forEach | 遍历 |
| map | 来处理每一个集合中的对象,并返回一个结果 |
| where | 来过滤集合中的值,并返回一个集合 |
| any | 来判断集合中的值是否符合条件,并返回bool |
| every | 来判断集合中的值是否符合条件,并返回bool |
Maps里面常用的属性和方法:
| 常用属性: | |
|---|---|
| keys | 获取所有的key值 |
| values | 获取所有的value值 |
| isEmpty | 是否为空 |
| isNotEmpty | 是否不为空 |
| 常用方法: | |
|---|---|
| remove(key) | 删除指定key的数据 |
| addAll({...}) | 合并映射 给映射内增加属性 |
| containsValue | 查看映射内的值 返回true/false |
| forEach | |
| map | |
| where | |
| any | |
| every |
三、函数
函数的类型是Function,也是对象
3.1.定义方式
返回值 函数的名称(参数列表) {
函数体
return 返回值
}
所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。
另外, 如果函数中只有一个表达式, 那么可以使用箭头语法(arrow syntax)
注意, 这里面只能是一个表达式, 不能是一个语句
sum(num1, num2) => num1 + num2;
3.2.函数的参数问题
函数的参数分成2种,必传参数和可选参数
// 可选参数分为两种:位置可选参数,命名可选参数
// 位置可选参数:[]
void Info2(String name,[int height]){
print(name);
}
// 命名可选参数{}
void Info3(String name,{int height}){
print("$name $height");
}
可以给可选参数添加默认值,但是必传参数不可以指定默认值
3.3.函数是一等公民
这就意味着你可以将函数赋值给一个变量, 也可以将函数作为另外一个函数的参数或者返回值来使用.
3.4.匿名函数的使用
main(List<String> args) {
// 1.定义数组
var letters = ['a', 'b', 'c', 'd'];
// 2.使用forEach遍历: 有名字的函数
printElement(item) {
print(item);
}
letters.forEach(printElement);
// 3.使用forEach遍历: 匿名函数
letters.forEach((item) {
print(item);
});
//这里也可以使用箭头函数
letters.forEach((item) => print(item));
}
3.5.词法作用域
{}会决定作用域的范围
3.6.词法闭包
闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。
main(List<String> args) {
makeAdder(num addBy) {
return (num i) {
return i + addBy;
};
}
var adder2 = makeAdder(2);
print(adder2(10)); // 12
print(adder2(6)); // 8
var adder5 = makeAdder(5);
print(adder5(10)); // 15
print(adder5(6)); // 11
}