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; const length = 2* num*10; print(length);
var num1=3.1415926; const num2=num1; }
|
Dart常量声明-final
1 2 3 4 5
| void main(List<String> args) { final time = DateTime.now(); print(time); }
|
- 用法与const一样的
- final与const的区别是 final是在运行时不可修改,const是编译时确定不可以修改
Dart中的常用数据类型
基本数据类型我就不写了只写一些不太相同的地方,重点集中于动态数据类型
- String 属性名 = ‘文本内容$变量名’; 或String 变量名=’文本内容${变量名}’
- 数值类型: int,double
- 布尔类型: bool
- 列表类型: List
- 映射类型: Map
Dart中的列表类型-List
- 场景:当一个变量需要存储多个值的时候,可以使用列表类型List
- 需求:一个班级的学生用List存储,支持对学生的查找、新增、删除、循环
- 语法:List 属性名 = [‘学生1’, ‘学生2’];
1 2 3 4
| void main(List<String> args) { List students = ["张三", "李四", "王五"]; print(students); }
|
输出结果:
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": "很好"}); transMap.containsKey("fine"); 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!.startsWith("xin");
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("新"); } bool result = isNewName("张三"); print(result); 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.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(); }
|