由于Flutter编写语言为Dart,所以想要学好Flutter就要先学好Dart的使用。
Dart语言的入口方法是main方法。即所有要被执行的代码都需要放在main方法中。
每条语句后面加分号代表语句结束。
1 2 3
| void main() { print('你好'); }
|
单行注释使用//
类型指定
类型可以使用弱语言指定方式,使用var关键字,系统会自动推断变量类型,也可以指定变量类型,如String
1 2 3 4 5 6
| void main() { int a=1; var b=1; print(a); print(b); }
|
命名规范
1.变量名称必须由数字、字母、下划线和美元符$组成
2.标识符的开头不能是数字
3.标识符不能是保留字或关键词
4.变量的名字区分大小写
5.标识符(变量名称)一定要见名知义,变量名称建议用名词,方法名称建议用动词。
常量
使用const和final修饰
const的值不变,一开始就得赋值
final可以开始不赋值,只能赋值一次
const与final最主要的区别:final不仅有const编译时的特性,最重要的是它是运行时常量,并且final是惰性初始化的,即在运行时第一次使用前才初始化。
1 2 3 4
| void main() { final a = new DateTime.now(); print(a); }
|
常用数据类型
1.字符串类型
(1)定义方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void main() { var str1 = "123"; String str3 = '''789 012'''; print(str1); print(str2); print(str3); }
输出结果: 123 456 789 012
|
(2)字符串拼接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void main() { var str1 = "123"; String str2 = "456"; var str3 = str1 + str2; var str4 = '$str1$str2'; print(str3); print(str4); }
输出结果: 123456 123456
|
2.数值类型
数值类型分为两种:int和double
int:整型
double:浮点型
3.bool类型
值分为true和false
1 2 3 4 5 6 7
| void main() { bool a=true; print(a); }
输出结果: true
|
4.数组/集合类型
List
定义方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void main() {
var arr = [1, 2, 3, 4]; print(arr);
var arr2 = new List(); arr2.add('刘方涵'); arr2.add(2); print(arr2); }
var arr3 = new List<String>(); arr3.add('1'); print(arr3); 输出结果: [1, 2, 3, 4] [刘方涵, 2] [1]
|
Set是没有顺序且不能重复的集合,所以不能通过索引去获取值
1 2 3 4 5 6 7 8 9
| void main() { var s = new List(); s.add("苹果"); s.add("苹果"); print(s); }
输出结果: [苹果, 苹果]
|
1 2 3 4 5 6 7 8 9
| void main() { var s = new Set(); s.add("苹果"); s.add("苹果"); print(s); }
输出结果: {苹果}
|
列表的每一项处理的简便方法:
1 2 3 4 5 6 7 8 9 10
| void main() { List a = [1, 2, 3]; var newList = a.map((value) { return value * 2; }); print(newList); }
输出结果: (2, 4, 6)
|
5.字典类型
Maps
类似于JS中的JSON对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void main() { var person = { "name": "刘方涵", "age": 20 }; print(person); print(person["name"]); var p = new Map(); p["name"] = "刘方涵"; p["age"] = 20; print(p); }
输出结果: {name: 刘方涵, age: 20} 刘方涵 {name: 刘方涵, age: 20}
|
获取对应的key和value
1 2 3 4 5 6 7 8 9 10 11
| void main() { var person = {"name": "刘方涵", "age": 20}; print(person.keys); print(person.values); }
输出结果: (name, age) (刘方涵, 20)
|
增加指定的数据项
1 2 3 4 5 6 7 8 9 10 11 12 13
| void main() { Map person={ "name":"刘方涵", "age":20 }; person.addAll({ "work":"济南大学" }); print(person); }
输出结果: {name: 刘方涵, age: 20, work: 济南大学}
|
删除指定的数据项
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void main() { Map person = { "name": "刘方涵", "age": 20 }; person.addAll({"work": "济南大学"}); print(person); person.remove("age"); print(person); }
输出结果: {name: 刘方涵, age: 20, work: 济南大学} {name: 刘方涵, work: 济南大学}
|
判断是否存在制定的数据
1 2 3 4 5 6 7 8 9 10 11 12
| void main() { Map person = { "name": "刘方涵", "age": 20 }; print(person.containsKey("age")); print(person.containsValue("刘方涵")); }
输出结果: true true
|
遍历:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void main() { Map person = { "name": "刘方涵", "age": 20 }; person.forEach((k,v){ print('$k--$v'); }); }
输出结果: name--刘方涵 age--20
|
数据类型的判断
使用is关键词来判断类型
1 2 3 4 5 6 7 8 9 10 11
| void main() { var a = "123"; if(a is String){ print("这是字符串类型"); }else{ print("它是其他类型数据"); } }
输出结果: 这是字符串类型
|
运算符
(1)算术运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void main() { int a=13; int b=5; print(a+b); print(a-b); print(a*b); print(a/b); print(a%b); print(a~/b); }
输出结果: 18 8 65 2.6 3 2
|
(2)关系运算符
==、!=、>、<、>=、<=
返回值为true或false
(3)逻辑运算符
!取反、||或者、&&并且
返回值为true或false
(4)赋值运算符
=、??=
1 2 3 4 5 6 7 8 9 10 11 12
| void main() { int a; a ??= 12; print(a); int b = 1; b ??= 3; print(b); }
输出结果: 12 1
|
(5)符合逻辑运算符
+=、-=、*=、/=、%=、~/=
条件表示式
(1)判断表达式
if else、switch case
三目运算符:
1 2 3 4 5 6 7 8
| void main() { var score = 90; score = score >= 90 ? 100 : 60; print(score); }
输出结果: 100
|
??运算符:
1 2 3 4 5 6 7 8 9 10 11 12
| void main() { var score = 1; score = score ?? 10; print(score); var x; x = x ?? 10; print(x); }
输出结果: 1 10
|
类型转换
(1)Number类型与String类型的转换
Number->String :toString();
String->Number:parse
1 2 3 4 5 6 7 8 9 10 11
| void main() { var score = "1"; double a = double.parse(score); if (a is double) { print(a); } }
输出结果: 1.0
|
1 2 3 4 5 6 7 8
| void main() { double num = 12.3; String str = num.toString(); print(str); }
输出结果: 12.3
|
(2)其他类型转换为bool类型
++、–
在赋值运算中,如果++、–写在前面,先运算再赋值,否则先赋值再运算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void main() { int a=1; print(++a); }
输出结果: 2 void main() { int a=1; print(a++); }
输出结果: 1
|
循环语句(与JS类似)
List详细
属性 |
含义 |
length |
长度 |
reversed |
翻转(不改变原列表) |
isEmpty |
是否为空 |
isNotEmpty |
是否不为空 |
方法 |
含义 |
add() |
插入数据(一次只能插入一个数据) |
addAll() |
一次性插入多个数据,传入的是个数组 |
indexOf() |
查找对应元素的下标,查找不到返回-1 |
remove() |
删除指定的数据,会改变原列表 |
removeAt() |
删除制定下表位置的元素 |
fillRange(start,end,修改的数据) |
修改指定位置的数据 |
insert(下标,插入的数据) |
在指定下标之前插入数据 |
insertAll(下标,插入数据 列表) |
在指定下标之前插入多个数据 |
函数
特殊的函数:
命名参数:形参位置使用大括号,并且在函数调用的时候指明传参时的形参名
1 2 3 4 5 6 7 8 9 10
| int test({int a}) { return a; } void main() { int b = test(a: 2); print(b); }
输出结果: 2
|
把参数当作方法的方法:
1 2 3 4 5 6 7 8 9 10 11 12
| fn1() { print("fn1"); } fn2(f) { f(); } void main() { fn2(fn1); }
输出结果: fn1
|
箭头函数:里面只能写一句话
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void main() { List a = [1, 2, 3, 4, 5]; a.forEach((value) { print(value); }); a.forEach((value) => print(value)); }
输出结果: 1 2 3 4 5 1 2 3 4 5
|
匿名方法:
1 2 3 4 5 6 7 8 9
| void main() { var fun = () { print(123); }; fun(); }
输出结果: 123
|
自执行方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void main() { (() { print(123); })(); }
输出结果: 123 ----------------------------------------------------------------------------------------- void main() { ((int n) { print(n); })(50); }
输出结果: 50
|
闭包
类
Dart是 一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。
按照编写规范,类名首字母最好大写
打印类中的信息时:
私有变量下划线开头
在属性和方法前面添加static关键字可以定义静态的属性和方法,非静态的属性和方法必须实例化后才能访问。
静态成员不能访问非静态成员,非静态成员可以访问静态成员。在访问静态成员时不能通过this关键字,this关键字代表的是这个类的实例
对象操作符
(1)?.条件运算符。当类的对象未被实例化的时候,使用条件运算符直接调用类的对象或者方法不会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class X{ int a; void setA(int a){ this.a=a; } int getA(){ return this.a; } } void main() { X a; print(a?.getA()); }
输出结果: null
|
(2)as类型转换(这个目前存在错误)
(3)is类型判断,与之前的用法一致
(4)..级联操作(可以简化代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
class X{ int a=3; void setA(int a){ this.a=a; } void printA(){ print(this.a); } } void main() { X x=new X(); x.printA(); x..setA(50) ..printA(); }
输出结果: 3 50
|
继承
(1)子类使用extends关键词继承父类
(2)子类会继承父类里面可见的方法和属性,但不会继承构造函数
(3)子类能够复写父类的方法getter和setter
@override在复写父类方法时可写可不写
抽象