Dart基础知识

96 阅读5分钟

一、简介

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或false
  • sort():对 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!');
    }
}