Dart初体验
效果:运行Dart程序,并输出字符串 ‘hello itcast’
- 创建Dart文件 hello.dart,(Dart文件的后缀是 .dart )
- 编写Dart代码
// 程序肯定都是有入口的 : main函数
void main(){
//打印字符串 'hello dart'
print('hello dart');
}
- 运行 hello.dart 文件
- 终端执行命令:
dart hello.dart
基础语法
能够知道变量和常量、数据类型、运算符、流程控制的基本使用
学习内容:
- 变量
- 常量
- 数据类型
- 运算符
- 流程控制
变量
-
思考:编写代码时,如何表示一个数字? 字面量
-
思考:编写代码时,如何对数据进行计算? 表达式
-
思考:如何记录计算结果? 变量
-
变量:
在计算机中记录计算结果,并在需要的时候使用,可以修改
语法:var 变量名 = 表达式;
var age = 18;
类型推断:var 声明的变量支持类型推断,并且有类型检查
void main(){
//计算机中,表示一个数字:字面量
1;
10;
//表达式 计算机中记录计算结果,使用表达式对数据进行计算并且得到结果
1 + 10 ;
print(1+10);
print(1+10);
//变量:计算机中记录计算结果,并且在需要的时候去使用
//语法:var 变量名 = 表达式
var num = 1+10;
print(num);
print(num);
//变量特点:
//可以修改
var age = 18;
print(age);
age = 19;
print(age);
// 支持类型推断:修改变量时会检查类型
// A value of type 'String' can't be assigned to a variable of type 'int'.
// age = 'hello';
}
常量
-
思考:如何记录不可变的数据? 常量:用于记录不可变的数据,不可以修改
-
关键字: const 和 final
-
语法:
-
区别:
- const 是
编译期常量
,用于记录程序在编译期就要能确定的值 - final 是
运行时常量
,用于记录程序在运行时确定的值
- const 是
void main(){
//const
const a = 10;
print(a);
// Constant variables can't be assigned a value.
// a = 20;
// final
final b = 30;
print(b);
//区别
var x = 1;
var y = 2;
//final:运行时常量,值在运行时赋值
final ret1 = x+y;
// const :编译期常量,值在编译时赋值
// const res2 = x+y;
const rest3 = 1+2;
}
数据类型
虽然,Dart可以使用var关键字定义不同类型的变量,并且有类型推断和检查
但是,我们依然可以在定义变量时明确的指定变量的类型,从而更好的做类型检查
学习内容:
-
常用数据类型
- num(数值)
- bool(布尔)
- String(字符串)
- List(列表)
- Map(字典)
-
Dart空安全机制
数值类型
布尔类型
bool 类型用于记录真 或 假,一般用于逻辑判断
真:true
假:false
void main() {
// 需求:使用布尔类型记录用户是否登录成功
// 登录成功:true
bool isLogin = true;
print(isLogin);
// 登录失败:false
isLogin = false;
print(isLogin);
}
字符串类型
- 定义字符串:String
// 定义字符串:String String name = 'zzm'; print(name);
- 拼接字符串: 插值表达式: ‘
表达式
′
或
′
{ 表达式 }' 或 '
表达式′或′变量’ 案例:拼接商品价格
double price = 199.0;
- 注意点:使用 + 拼接字符串时,只能 ‘字符串’ + ‘字符串’
// String priceStr = '${price}起'; String priceStr = '$price起'; print(priceStr);
void main() {
// 定义字符串:String
String name = 'zzm';
print(name);
// 拼接字符串: '199.0起'
// 准备价格:double
double price = 199.0;
// 价格字符串拼接
// String priceStr = '${price}起';
String priceStr = '$price起';
print(priceStr);
}
List(列表)类型
- List(列表)可以有序的存储数据 定义列表:List
// 定义列表:List // 需求:按序存储 '居家' '美食' '服饰' List categories = ['居家', '美食', '服饰'];
- 使用列表:查改增删
- 列表长度:列表. length
- 查询:列表[角标]
- 修改:列表[角标] = 新值
- 新增:
新增一个元素:列表.add(新值) 新增一个列表:列表. addAll(新列表)
删除: 删除指定的元素: remove(元素) 或者removeAt(角标) (侧滑删除购物车时使用 - 遍历列表:列表.forEach()
void main() {
// 定义列表:List
// 需求:按序存储 '居家' '美食' '服饰'
List categories = ['居家', '美食', '服饰'];
print(categories);
List nums = [1, 3, 5, 7];
print(nums);
// 使用列表:查改增删
// 查询:
// 查询列表的长度,就是列表内部元素的个数
int len = categories.length;
print(len);
// 查询指定的元素: 列表[索引]
String category = categories[1];
print(category);
// 修改:列表[索引] = 新值
categories[1] = '美食家';
print(categories);
// 新增:
// 新增一个元素,一次新增一个元素:列表.add(新元素)
categories.add('母婴');
print(categories);
// 新增一个列表,一次新增多个元素:列表.addAll(新列表)
categories.addAll(['办公', '生鲜']);
print(categories);
// 删除
// 使用元素删除
categories.remove('生鲜');
print(categories);
// 使用索引删除
categories.removeAt(4);
print(categories);
// 遍历列表:取出所有商品分类名称
// element: 列表中遍历读取的元素
categories.forEach((element) {
print(element);
});
}
Map(字典)类型
Map(字典)是使用 键值对 来存储数据的
语法:{ key: value }
// 需求:记录商品分类的编号 和 名称
Map category = {
'id': 1,
'name': '居家',
};
- 定义字典:
- 使用字典:查改增删
- 查询:字典[key]
- 修改:字典[key] = 新值
- 删除:字典.remove(key)
- 新增(不常用):字典[新key] = 新值(注意:新key 必须是 不存在的key)
- 遍历字典:字典.forEach()
void main() {
// 定义字典:{key: value}
// 需求:记录商品分类的编号 和 名称
Map category = {
'id': 1,
'name': '居家',
};
// 使用字典:查改增删
// 查询:字典[key]
String name = category['name'];
print(name);
// 修改:字典[key] = 新值
category['name'] = '美食';
print(category);
// 删除:remove(key)
category.remove('name');
print(category);
// 新增:字典[新key] = 值
// 注意:key必须是当前字典中不存在的key,很少使用新增
category['name'] = '办公';
print(category);
// 遍历字典
category.forEach((key, value) {
print('$key -- $value');
});
}
Dart空安全机制
-
Dart 从 2.12.0 版本开始,已支持健全的空安全机制
-
在空安全机制下,代码中的类型默认都是非空的 除非将变量明确的声明为可空,否则它一定是非空的类型
-
作用:原本处于运行时的空值引用错误,将变为编译时的分析错误,从而BUG会发现的更早
-
空安全机制下,如何定义并使用变量?
-
变量不能为空时:指定默认值
-
变量可以为空时:使用 ? 明确的指定变量可以为空
` // 直接设置默认值
String name2 = 'itheima';
// The non-nullable local variable 'name2' must be assigned before it can be used.
print(name2.length);
// 使用 ? 明确的指定变量可以为空
String? name3;
// name3? : 表示非空检查,如果name3为空,不去调用属性或方法,如果name3不为空,可以调动属性或方法
print(name3?.length); `
void main() {
// 需求:定义字符串,并获取字符串长度
String name1 = 'zzm';
print(name1.length);
// 直接设置默认值
String name2 = 'zzxm';
// The non-nullable local variable 'name2' must be assigned before it can be used.
print(name2.length);
// 使用 ? 明确的指定变量可以为空
String? name3;
// name3? : 表示非空检查,如果name3为空,不去调用属性或方法,如果name3不为空,可以调动属性或方法
print(name3?.length);
}