一、简介
Hello World
每个应用都有一个顶层的 main() 函数来作为运行入口。没有指定返回类型的方法的返回类型会推导为 void。你可以使用顶层函数 print() 来将一段文本输出显示到控制台:
void main(){
print('Hello World!');
}
二、变量
1、变量声明
var name = 'once'; // 类型推断
int num = 999; // 显式声明
final PI = 3.14; // 运行时常量
const age = 18; // 编译时常量
dynamic dyn = 6; // 动态类型
var multi = '''
line 1
line 2
line 3
'''; // 多行字符串
2、数据类型
String str = 'nihao'; // 字符串
int num = 1; // 整数
double price = 9.9; // 浮点类型
bool isNew = true; // 布尔
List<String> arr = ['1', '2']; // 列表
Map<String, int> obj = { // 集合
'name': 'twice',
'age': 18
}
3、类型判断
var str = '123';
print(str is String); // true
4、类型转换
var str = '123';
int num = int.parse(str);
String strNew = num.toString();
三、运算符
| 运算符 | 描述 | 运算符 | 描述 |
|---|---|---|---|
| = | 变量赋值 | += | 加法赋值 |
| -= | 减法赋值 | *= | 乘法赋值 |
| /= | 除法赋值 | /= | 整数除法赋值 |
| <<= | 按位左移赋值 | >>= | 按位右移赋值 |
| &= | 按位与赋值 | ^= | 按位异或赋值 |
| != | 按位或赋值 |
空安全运算符
String nonNullable = '非空'; // 不能为null
String? nullable; // 可以为null
// 安全访问
print(nullable?.length ?? 0);
// 空断言
if (nullable != null) {
print(nullable!.length); // 确定不为null
}
```dart
main(){
var num = 9;
num +=2; // 11
num -=2; // 9
num *=2; // 18
num /=2; // 9
num %=2; // 1
num = 9;
num ~/2; // 4
num <<= 2; // 16 => 0100 按位左移两位
num >>= 1; // 8 => 0001 0000 按位右移一位
num &= 1; // 0 => 两个数的每一位进行比较,若相应的位都为1,则结果在该位上为1
// 按位或 => 两个数的每一位进行比较,若两个相应的位中至少有一个为1,则结果在该位上为1,只有当相应的位都为0时,结果在该位上才为0
num ^= 1; // 0 => 两个数的每一位进行比较,若相应的位一个为0,一个为1,则结果在该位上为1,;若两个相应位都为0或都为1,则结果在该位上为0
}
四、控制流程语句
1、条件
1️⃣ if else if else
int num = 100;
if(num > 90){
...
}else if(num >=80){
...
}else { ... }
2️⃣ 三元运算符
bool flag = true;
var str = flag ? 'true' : 'false';
2、循环
1️⃣ for 循环
for( var i = 0; i < 9; i++){ ... }
2️⃣ for-in 循环
var arr = [1, 2, 3];
for (var num in arr){ ... }
3️⃣ while 循环
while(条件){
...
}
4️⃣ do-while 循环
do{
...
}while(条件);
3、switch语句
switch(条件){
case '1':
print('111');
break;
case '2':
print('222');
break;
default:
print('not found');
}
五、集合类型
1、List(列表)
List是有序的集合,类似于其他语言中的数组
List<Int> nums = [1, 2, 3];
nums.add(4); // 添加
nums.addAll([5, 6, 7]); // 添加一个List
nums.insert(1,8); // 在指定位置插入一个元素
nums.insertAll(2, [9, 10]); // 在指定位置插入List
nums.remove(1); // 删除第一个匹配的元素
nums.removeAt(1); // 删除指定索引的元素
nums.removeLast(); // 删除最后一个元素
nums.removeWhere((ele) => ele < 2); // 删除符合条件的所有元素
nums.clear(); // 清除所有元素
其他常用方法
indexOf():查找某个元素首次出现的索引,如果未找到则返回 -1。lastIndexOf():查找某个元素最后一次出现的索引。contains():判断 List 中是否包含某个元素。返回true或falsesort():对 List 进行排序。reversed:反转 List 的顺序。map():通过给 List 中的每个元素应用一个函数来转换元素。where():过滤 List 中符合条件的元素。toSet():将 List 转换为 Set,去除重复的元素。- forEach():遍历 List 中的每个元素。
- join():将 List 中的元素连接为一个字符串。
- split():将字符串按照指定的分隔符切割成一个字符串列表。
- first:获取 List 中的第一个元素。
- last:获取 List 中的最后一个元素。
- isEmpty:判断 List 是否为空。
2、Set(集合)
Set是无序且元素唯一的集合
Set<int> nums = {1, 2, 3};
nums.add(4); // 添加
nums.add(1); // 无效,1已经存在
3、Map(映射)
Map是键值对的集合
Map<String, int> scores = {
'First': 100,
'Second': 99
};
scores['Third'] = 98; // 添加
print(scores['First']); // 访问
print(scores.length); // 获取长度
print(scores.containsKey('Second')); // true 判断键是否存在
socres.addAll({'fourth': 97, 'fifth': 96}); // 添加一个Map
scores.update('fifth', (value) => value + 0.1); // 更新指定键的值
scores.update('sixth', (value) => value + 1, ifAbsent: () => 66); // 若指定键不存在,可赋默认值
scores.updateAll(key, value) => value + 0.1); // 更新所有值
socres.remove('fifth'); // 删除
scores.removeWhere((key, value) => value > 99); // 条件删除
scores.clear(); // 清空
print(socres.keys); // 获取所有键
print(socres.values); // 获取所有值
scores.forEach((key, value){ ... }); // 遍历
print(scores.isEmpty); // true 判断是否为空
print(scores.isNotEmpty); // false 判断是否不为空
print(scores.containsValue(99)); // true 判断值是否存在
Map<String, Int> copyMap = Map.from(scores); // Map.from() 复制map
六、函数
1、函数定义
int add(int a, int b){
return a + b;
}
// 箭头函数形式
int multiplication(int a, int b) => a * b;
2、函数参数
1️⃣必传参数
void saying(String name, String content){
print('$name said $content');
}
saying('cowice', 'well done');
2️⃣可选参数
void sayHello(String name, [String? age, String? content]){
...
}
sayHello('cowice', 18); // 传一个可选参数
sayHello('cowice', 18, 'well done'); // 传所有可选参数
3️⃣命名参数
以键值对的方式明确传参,可省略参数,可默认值,可使用required强制传参
void saying({
require String name,
int age = 18, // 默认值,必须是常量非变量
bool isFlag = true
}){ ... }
saying(name: 'cowice', age: 20, isFlag: false);
4️⃣函数作为参数
void func(Function todo){
todo(1, 2);
}
func((a, b) => print(a + b));
5️⃣匿名函数
var list = [1,2,3];
list.forEach((item) => { ... });
七、Class类
1、定义
class Animals{
String name;
int age;
// 构造函数
Animals(this.name, this.age);
// 方法
void eat(){
print('名叫$name, 年龄$age岁。。。);
}
}
2、继承
class Dog extends Animals{
String height;
Dog(String name, int age, this.height): super(name, age);
@override
void eat(){
super.eat();
print(...);
}
}
3、抽象类
abstract class Animals{
void running();
}
class Dog implements Animals{
@override
void running(){
print('running!');
}
}