一. Hello Dart
1.1 Hello Dart
和大多数语言一样,Dart的入口函数也是Main函数,新建一个helloDart.dart的文件,添加以下代码:
main(List<String> args) {
print('Hello Dart');
}
终端执行dart helloDart.dart,便可以看到结果。
二. 定义变量
2.1 明确声明 Explicit
变量类型 变量名称 = 变量值;
String name = '小灿';
int age = 24;
double height = 1.70;
!注意:明确声明之后的变量不可以被其他类型的变量赋值
2.2 类型推导
var/dynamic/const/final 变量名称 = 变量值;
- var在使用时会在直接获取当前赋值的变量类型,获取之后类型就确定了下来,不可以再使用其他类型给该变量赋值
var name = '小灿';
name = 18; // 错误,在第一次赋值的时候name变量已经被确定为String型
- dynamic,动态确定变量类型,不建议该写法,容易出现类型安全问题
dynamic name = '小灿'; // name为String类型
name = 18; // name为int类型
2.2.1 final和const(常量)
final和const都是用于定义常量的,在获得了确定的值之后都是不可以被修改的。但是二者的使用是有区别的,final是在运行时动态获取的一个常量值,而const是在编译期间就已经确定下来的常量值。
// const
const name = '小灿'; // 正确
// const date = DateTime.now(); // 错误
final date = DateTime.now(); // 正确
- name的赋值是在编译的时候就给定了一个确定的字符串,是正确的
- date的值是在运行时通过DateTime.now()去实时获取的,该情况下是不能用const的
- final可以在运行时给定一个常量
- final和const赋值之后都不可以再被改变
三.数据类型
3.1 数字类型
int age = 24;
double height = 1.70;
// 字符串转换成数字
int ageNum = int.parse('24');
double heightNum = double.parse('1.70');
// 数字转换成字符串
String ageString = ageNum.toString();
String heightString = heightNum.toString();
3.2 布尔类型
bool isGirl = true;
isGirl = false;
// Dart中不可以判断非空即真
String name = '小灿';
// if (name) {
//
// }
// 错误的用法
3.2 字符串类型
// 单双引号都行
String s = 'Hello Dart';
String s1 = "Hello Dart";
// 多行字符串可以用三引号
String s2 = '''
Hello Dart
nihao
Happy
''';
// 字符串拼接
String name = '小灿';
int age = 24;
double height = 1.70;
print('name:${name}, age:$age, height:$height');
// 可以使用$(xxx)的方式拼接字符串,当xxx是一个标识符的时候,{}可以省略
3.2 集合
Dart有三种集合类型 List / Set / Map
- List
List list = ['a','b','c','d']; // 这种方式是推导List的数据类型
List<int> intList = [1,2,3,4]; // 指定List的数据类型为int
- Set (相对于List,Set是无序且元素是不重复的)
Set set = {'a','b','c','d'}; // 这种方式是推导Set的数据类型
Set<int> intSet = {1,2,3,4}; // 指定Set的数据类型为int
- Map
Map map = {'name' : '小灿', 'sex' : '男'}; // 这种方式是推导Map的数据类型
Map<String, String> typeMap = {'name' : '小灿', 'sex' : '男'}; // 指定Map的数据类型
集合类型的常见操作
// 获取长度
print(list.length);
print(set.length);
print(map.length);
// 添加元素
list.add(xxx);
set.add(xxx);
// 删除元素
list.remove(xxx);
set.remove(xxx);
list.removeAt(index)// 根据下标删除
// map的基本操作
// 根据key获取具体内容
print(map['name']); // 小灿
// 获取所有内容
print('${map.entries}');// (MapEntry(name: 小灿), MapEntry(sex: 男))
// 获取所有key
print('${map.keys}'); // (name, age)
// 获取所有key
print('${map.values}'); // (小灿, 男)
// 判断是否包含某个key
map.containKey('xxx'); // true || false
// 根据key删除元素
map.remove('xxx');
四.函数
函数在Dart中也是属于一种对象,类型为Function,因此在Dart中函数可以作为变量作为其他函数的参数或者返回值,一般我们称之为函数是一等公民。
函数的定义:
返回值 函数名称 (参数列表) {
函数体
return 返回值
}
// 完整的函数定义
int sum(num num1, num num2) {
return num1 + num2;
}
// 箭头函数语法 内容不能是语句,只能是一个表达式
sum(num num1, num num2) => num1 + num2;
参数
参数有两种类型:可选参数、必选参数
- 可选参数
// 命名可选参数
funcName( {int age, double height}) {
}
// 调用 命名可选参数调时参数不区分顺序
funcName();
funcName(age: 24);
funcName(height: 1.70);
funcName(age: 24, height: 1.70);
// 位置可选参数
funcName2([int age, double height]) {
}
// 调用 位置可选参数在传参数时必须按照声明时的顺序传参
funcName2();
funcName2(24);
funcName2(24, 1.70);
- 必选参数
// 必选参数
funcName(String name) {
}
// 调用
funcName("xxx");
-
参数的默认值
可选参数才可以有默认值,必选参数没有默认值
// 默认值
funcName({int age = 24, double height = 1.70}) {
}
-
匿名函数
有些情况下,不对函数进行命名可能会更方便,或者说更简单,我们可以使用匿名函数
List list = ['a','b','c'];
// 打印数组
// 命名函数打印
func(value) {
print(value);
}
list.forEach(func);
// 匿名函数打印
list.forEach((value) {
print(value);
});