[TOC]
dart
变量
dart所有类型都是对象 int i; 不给i赋值,输出的时候就是null
var关键字:
在声明的变量赋值那一刻,就决定了它是什么类型。
1
2
3
4
5
6
7
8
9//这样的var是可以重新赋值不同的值
//var 在声明变量赋值的那一刻,就决定了它是什么类型
var a;
a = 10;
a = "sfasdf";
//这样会出现错误
var b = 0;
b = "";
dynamic关键字:
在运行的时候决定类型
1 | dynamic z = "laaa"; |
Object关键字:
1 | Object s = 0; |
final和const关键字:
final 关键字根java 差不多
运行时常量
const 和final差不都
编译器常量:const效率比较高,确定的值
1
2//编译完成之后,所有用到i的地方都变成1了
const i = 1;1
final 类型可以被const赋值
内置类型
- int:
1
2
3
4
5
6//int 在java占4个字 dart也认为是4位
//当成java的short int long类型来使用
//如果 我们写的dart超过了4个字节,那么dart会将其编译成类似的java 当中的long
//否则编程java当中的short或者int
int i = 0xffffffffffffff;
print(i.bitLength);String
1
2
3
4
5
6
7
8
9
10
11
12
13
14//2.1 格式化
String str = "发达";
int num = 10;
//$符号去拼接字符串
//建议使用 {} 包起来
String a = "${str}我要找$num号技师";
//2.2 单引号,和双引号 都可以声明
String s = '';
String s1 = '"test"';
String s2 = "'sfasf'";
print(s2);bool
List数组
1
2
3
4
5
6
7List<String> list = new List();
List<String> list = List();
list.add("asfdsaf");
//像数组一样取值
String value = list[0];
print(value);
操作符
方法
dart 可以不在类里面写方法,这个就叫顶层方法
一等方法对象 typedef关键字
1
2
3
4
5
6
7typedef void OnClick();
class Button {
void setOnClick(OnClick onclick) {
onclick();
}
}
可选参数位置
1
2
3
4
5
6//可选位置参数 可以使用[] 来进行
// j = 2 是个默认值
void fun([int i, int j = 2]) {
}
fun(1, 0)可选命名参数
1
2
3
4
5
6
7//可选命名参数
void funasdfa({int i, int j = 2}) {
}
fun(j:10);
fun(j:10,i:11);可选参数位置; 可选命名参数不需要想java一样写大量的构造函数了
异常
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
void test() {
// throw new Exception("sfasfas");
//万物皆对象 111
throw 111;
}
void main() {
//介绍cast的参数,可以填写两个参数
try {
test();
} catch (e, s) {
//就是抛出异常对象
print(e.runtimeType);
//调用栈信息
print(s.runtimeType);
print(s);
} finally {
print("aaaaaa");
}
//根据不同的异常类型,进行不同的处理
// on TYPE catch
// dart 可以抛出对象
try {
test();
} on Exception catch (e) {
print(e);
} on Error catch (e) {
print(e);
} on int catch (e) {
print(e);
}
}
- 类
1 | ///类 dart 命名规则 小写_小写_小写,风格来命名库和文件名名字 |
构造函数语法糖
1
2//构造函数语法
Preson(this.x,this.y);命名构造函数
1
2
3
4//命名构造方法 要一个this
//一看就知道这个
Point.Xafdasf(this.y);
Point.Xa(y);参数初始化列表
1
复习:
一 变量
final和const
const 是编译时就确定的
一个数组被定义了,就无法再改变了,即使是数组内的数据
而final仍然可以进行改变内部的值
根据const的修饰位置不一样导致表现不一样
const可以这样修饰
List
list = const [] 表示[]这个在编译时已经确定了,而list还是个指向另一个数组对象
List
list = []; //这样是没有问题的 修饰在变量的前面,这个list不能被改变,重新赋值的时候回报错
添加的数据也是会报错1
Unsupported operation: Cannot add to an unmodifiable list
const List
list = []; const还可以修饰构造方法, final不能
final 是运行时确定的
final修饰是变量的指向的对象已经确定了, 不能直接修饰对象身上而const是可以修饰在对象上面的.
final List
list = []
list.add(1); //值是可以加入进去的,可以进行增删改查1
2final List<int> list2 = [];
list2..add(1)..add(2)..add(3); //.. 是级联操作1
List<int> list =final [] //这样修饰会报错,这个const的用法就不一样
名字 区别 相同点 const 1. const是编译时的
2. const可以修饰在对象上,表示对象在编译时就已经确定了
3. const可以修饰在构造方法上面,表示构造方法编译时已经确定了,前提是已经确定的值;必须依靠编译期间就能够计算出来的数据进行创建都是修饰后,不能进行修改。 final 1.final是运行时的
2.不能修饰构造方法
3.不能修饰对象上面 ;如:final [] 是错误的var object dynamic 三者的区别
var 是个关键字: 声明变量的那一刻就已经确定了类型
1
2var p = Person();
p = 10; //这个值就不能进行赋值了,编译器会在这行报错1
2
3
4//这种方式是可以的,以最后个p的赋值为准
var p;
p = Person();
p = 10;Object :万物之主
1
2
3//object可以这样使用
Object p = Person();
p = 10;1
2
3
4//这样也是对的
Object p;
p = Person();
p = 10;dynamic : 运行时确定类型
1
2
3
4
5
6
7
8dynamic p = Person();
p = 10;
p = 'asfasdf';
dynamic p ;
p = Person();
p = 10;
p = 'asfasdf';
二 7大内置类型
num: int , double
万物皆对象: 在int 和 double 值如果没赋值就是null
String : 注意一个三引号
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
/**
* 字符串
* 不推荐使用 + 来进行字符串拼接, 会创建很多string对象
*
*/
//2.1 格式化
String str = "发达";
int num = 10;
String a = "${str}我要找$num号技师";
//2.2 单引号,和双引号 都可以声明
String s = '';
String s1 = '"test"';
String s2 = "'sfasf'";
print(s2);
String s3 = "沙发斯蒂芬\n沙发斯蒂芬";
//r前缀 row:原始
String s5 = r"\n";
print(s5);
print(s3);
// 三引号 多行字符串声明
// 大厂思维, 不要用小厂思维
String s6 = """sssss
sfasfas
sfasfas
sfasfasdfs""";
print(s6);
list : 数组,跟java 的list不一样,和java数组差不多
1
2
3
4
5List<String> list = new List();
// List<String> list = List();
list.add("asfdsaf");
String value = list[0];
print(value);
map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/**
* 映射集合
*
*/
Map<int, int> map = {1: 1, 2: 2, 10: 4};
print(map[10]);
//Unhandled exception:
//Unsupported operation: Cannot set value in unmodifiable Map
// var map1 = const {1: 1, 2: 2};
// map1[3] = 10;
for (var o in map.keys) {
print(o);
}
bool
Runes
1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* Runes : 特殊字符表示类: Unicode32
*
*/
Runes ss = Runes("sfasdf");
print(ss);
// java String 本身是16位
//超过4位就要用 {} 这个括起来
// String 代码点,代码单元 String.length() 表现的跟字符长度一样的
// 后面增加到32位 一开始java设计string类的时候只有16位,认为这么多就可以了
// String.length() utf-8个个数
var clapping = '\u{1f44f}';
print(clapping);
Symbols
1
2
3
4
5
6
7
8
9
10
11/**
* symbols 标识符
*
*/
var aaa = #sfaf;
switch (aaa) {
case #afa:
break;
}
三 操作符
类型转换和类型判断操作符 (as 和 is is! )
as 相当于 java中的强制转换
is 相当于 instanceof 这个关键字
is! 表示不是这个类的类型
赋值操作符
//这个叫安全赋值
objec x = A ??= B : 如果A是null的情况下选择B,否则选择A
条件表达式
1
2
3* A ?? B 如果A 为null, 就返回B
* 如果A不为null,就返回A
A ?? A级联操作
final List
list2 = [];
list2..add(1)..add(2)..add(3); //.. 是级联操作安全操作符
kotlin里面貌似也常用这个操作符
?.1
2
3
4
5
6/**
* ?. 安全操作符
*
*/
String str;
print(str?.length);
三 方法
一等方法对象
1
2
3
4
5
6
7
8
9
10
11
12typedef Function My(int x, int y);
void fun(My f) {
f(10, 21);
}
void main() {
Function f = (int i, int j) {
print("11111" + i.toString());
};
fun(f);
}
可选位置参数 []
1
2
3void fun2([int x, int y]) {
print(x);
}
可选命名参数
1
2
3void fun3({int x, int y}) {
print(x);
}默认参数值
1
2
3void fun4({int x, int y = 10}) {
print(x);
}
匿名方法
相当于lambda表达式
(v) {
}
1
2
3var func = () {
print("Hello");
};
四 异常
dart中的异常和java差不多
1