Flutter

Dart基础

Dart变量声明-var

1
2
3
4
5
6
7
8
void main(List<String> args) {
var age = 20;
print(age);
age =21;
print(age);
var age1= "测试1";
print(age1);
}
  • 语法: var 变量名=值/表达式;
  • 注意:当声明的变量类型第一次以后不能再更改其类型,例如:上述代码中不能将age在下面赋值
    String类型的值

Dart常量声明-const

1
2
3
4
5
6
7
8
9
10
11
void main(List<String> args) {
const num=3.1415926;
print(num);
num=100;//错误写法1
const length = 2* num*10;
print(length);

//第二种
var num1=3.1415926;
const num2=num1; //错误写法2
}
  • 常量不能更改
  • 常量表达式里面的值不能允许有变量

Dart常量声明-final

1
2
3
4
5
void main(List<String> args) {
//获取当前时间
final time = DateTime.now();
print(time);
}
  • 用法与const一样的
  • final与const的区别是 final是在运行时不可修改,const是编译时确定不可以修改

Dart中的常用数据类型

基本数据类型我就不写了只写一些不太相同的地方,重点集中于动态数据类型

  1. String 属性名 = ‘文本内容$变量名’; 或String 变量名=’文本内容${变量名}’
  2. 数值类型: int,double
  3. 布尔类型: bool
  4. 列表类型: List
  5. 映射类型: Map

Dart中的列表类型-List

  • 场景:当一个变量需要存储多个值的时候,可以使用列表类型List
  • 需求:一个班级的学生用List存储,支持对学生的查找、新增、删除、循环
  • 语法:List 属性名 = [‘学生1’, ‘学生2’];
1
2
3
4
void main(List<String> args) {
List students = ["张三", "李四", "王五"];
print(students);
}

输出结果:

1
[张三, 李四, 王五]

Dart中的列表类型-List的常用操作方法

  • 在尾部添加-add(内容)
  • 在尾部添加一个列表-addAll(列表)
  • 删除满足内容的第一个-remove(内容)
  • 删除最后一个-removeLast()
  • 删除索引范围内数据-removeRange(start,end)

Dart中的列表类型-List的常用操作方法和属性

  • 循环-forEach((item) {});
  • 是否都满足条件-every((item) { return 布尔值 });
  • 筛选出满足条件的数据-where((item) { return 布尔值 });
  • 列表的长度(属性)-length
  • 最后一个元素(属性)-last
  • 第一个元素(属性)-first
  • 是否为空(属性)-isEmpty

Dart中的字典类型-Map

Dart中的字典类型-Map的常用操作方法

  • 循环-forEach
  • 在添加一个字典-addAll
  • 是否包含某个key-containsKey
  • 删除某个key-remove
  • 清空-clear
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main(List<String> args) {
// 定义一个字典
Map<String, String> transMap = {"hello": "你好", "world": "世界"};

// 循环
transMap.forEach((key, value) {
print('$key,$value');
});
// 添加一个字典
transMap.addAll({"fine": "很好"});
// 是否包含某个key
transMap.containsKey("fine");
// 删除某个key
transMap.remove("fine");
// 清空字典
transMap.clear();
}

Dart中的动态类型-dynamic和var的区别

区别对比

  • dynamic: 运行时可自由改变类型,无编译检查,方法和属性直接调用
  • var: 根据初始值进行推断类型,确定类型后类型确定,有编译检查,仅限推断的属性和方法

代码示例

1
2
3
4
5
6
7
void main(List<String> args) {
// 自由设置类型
var text = 1;
text.toDouble();
dynamic text1 = 1;
text1.startsWith(""); // 虽然运行报错,但是绕过编译,不会提示
}

Dart的空安全机制

空安全特性

  • 可空类型: 使用 ? 标记变量可以为 null
  • 安全访问: 使用 ?. 操作符安全访问可能为 null 的对象的方法或属性
  • 非空断言: 使用 ! 操作符告诉编译器变量一定不为 null(需谨慎使用)
  • 空合并操作符: 使用 ?? 提供默认值

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
void main(List<String> args) {
String? userename = null;// ? 表示可空类型
userename?.startsWith("新");// 表示安全访问
// ?表示客观
// !表示主观判断,开发者认为userename一定不为null
userename!.startsWith("xin");

//空合并,左侧为null,则返回右侧默认值
String displayName = userename ?? "默认用户";
print(displayName);

}

Dart中的函数

  • 场景:当一个功能需要被重复使用的时候,可以使用函数
  • 需求:一个班级的学生用List存储,支持对学生的查找、新增、删除、循环
  • 语法:void 函数名(参数1,参数2){ 函数体 }
1
2
3
4
5
6
7
8
void main(List<String> args) {
// 定义一个函数,用于判断字符串是否以新开头
int add(int a,int b){
return a+b;
}
int result = add(1,2);//调用
print(result);
}

注意:返回值类型可省略,Dart会自动推断类型为dynamic

可选位置参数

特点:可选位置参数必须位于必传参数后面,采用中括号包裹

语法函数名(String a, [String? b...])

传递方式:按照顺序传递

适用场景:参数少且顺序固定时

1
2
3
4
5
6
7
8
9
10
11
void main(List<String> args) {

int add(int a,int b,[int? c]){
return a+b+(c??0);
}
int result = add(1,2);
print(result);
// 可选参数可以不传递
int result2 = add(1,2,3);
print(result2);
}

可选命名参数

特点:可选命名参数采用大括号包裹,可按任意顺序传递

语法函数名(String a, {String? b, int? c})

传递方式函数名(a: '值', b: '值')

适用场景:参数多且顺序不固定时

1
2
3
4
5
6
7
8
9
10
11
12
void main(List<String> args) {
// 定义一个函数,用于判断字符串是否以新开头
bool isNewName(String name, {bool? isNew}) {
return isNew == true && name.startsWith("新");
}
// 调用函数时,可以不传递isNew参数,默认值为false
bool result = isNewName("张三");
print(result);
// 调用函数时,可以传递isNew参数,值为true
bool result2 = isNewName("新张三", isNew: true);
print(result2);
}

匿名函数

特点:可以声明一个没有名称的函数赋值给变量,进行调用

语法Function 变量名 = () {};

注意:函数的类型使用Function来声明

箭头函数

特点:当函数体只有一行代码时,可以使用箭头函数编写

语法函数名() => 代码逻辑

注意:使用箭头函数可以省略return关键字

代码示例

1
2
3
4
5
6
main(List<String> args) {
// 箭头函数
int add(int a, int b) => a + b;
int result = add(1, 2);
print(result);
}

Dart中的类

类的定义

定义:Dart语言中,类(class)是面向对象编程的核心,类包含属性和方法来定义对象的行为和状态

需求:定义一个Person类,属性包括姓名、年龄、性别,包括学习的方法

定义类语法class Person{属性方法}

实例化对象Person 变量 = Person();

属性和方法变量.属性/方法()

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Person {
// 属性
String name;
int age;
String gender;

// 构造函数
Person(this.name, this.age, this.gender);

// 方法
void study() {
print('$name正在学习');
}
}

void main(List<String> args) {
// 实例化对象
Person person = Person('张三', 18, '男');

// 访问属性
print(person.name);
print(person.age);
print(person.gender);

// 调用方法
person.study();
}

构造函数

Dart中类的构造函数-默认构造函数

定义:实例化对象的时候,使用构造函数直接给对象中的属性赋值

常见分类:默认构造函数、命名构造函数、构造函数的语法糖

定义语法

1
2
3
4
5
class 类名 {
类名(可选命名参数) {
// 构造函数体
}
}

实例化语法

1
Person p = new Person(属性: 值);

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person {
String? name = ""; // 姓名
int? age = 0; // 年龄
String? sex = "男"; // 性别

//默认构造函数
Person({String? name, int? age, String? sex}) {
this.name = name;
this.age = age;
this.sex = sex;
}

void study() {
print("$name在学习");
}
}

Dart中类的构造函数-命名构造函数

定义:构造函数可以采用命名的方式,返回一个实例化对象

定义语法

1
2
3
4
5
class 类名 {
类名.构造函数名(可选命名参数) {
// 构造函数体
}
}

实例化语法

1
Person p = Person.构造函数名(属性: 值);

注意:默认构造函数和命名构造函数可同时存在

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Person {
String? name = ""; // 姓名
int? age = 0; // 年龄
String? sex = "男"; // 性别

//默认构造函数
Person({String? name, int? age, String? sex}) {
this.name = name;
this.age = age;
this.sex = sex;
}

// 命名构造函数
Person.withName(String name) {
this.name = name;
}

void study() {
print("$name在学习");
}
}

void main(List<String> args) {
// 使用默认构造函数
Person p1 = Person(name: "张三", age: 18, sex: "男");

// 使用命名构造函数
Person p2 = Person.withName("李四");

p1.study();
p2.study();
}

#### Dart中类的构造函数-构造函数语法糖

**定义**:同名构造函数和命名构造函数都支持简写写法

**语法**:
```dart
class 类名 {
类名({ this.属性1, this.属性2 });

类名.命名函数({ this.属性1, this.属性2 });
}

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Person {
String? name;
int? age;
String? sex;

// 命名构造函数
// Person(this.name, this.age, this.sex); // 简写
Person.createPerson({this.name, this.age, this.sex}); // 命名函数简写

void study() {
print('$name在学习');
}
}

void main(List<String> args) {
Person p = Person.createPerson(name: '张三');
p.study();
Person pp = Person.createPerson(name: '张三');
pp.study();
}