void main() {
//const与final 都不可更改,const是编译器常量,final是运行时常量
const cc = 100;
final ff = 100;
final fff = cc;
//错误 编译器流程在前,此时ff未赋值
// const ccc = ff;
// var
//1 var 初始化为String ,不能改为int
var a = "ss";
// a = 10;
//2 var 不进行初始化,
var b;
b = "ss";
b = 100;
//Object 父类,任意改变
Object c = "ss";
c = 100;
//dynamic 写法与Object 一致,但是编译器不会进行检测,Object类型确定编译器会检测
dynamic d = "ss";
d = 100;
//没有改方法编译器不报错
// d.foo();
//int 会根据赋值给不同的内存大小,跟java的4个确定字节不一样
int e = 1;
// e.bitLength = 1;
e = 10;
// e.bitLength = 4;
//String使用跟kotlin一致
String f = "ss";
f = "ss$f";
f = """
aaa
bbb
ccc
""";
//r 原始类型 raw 下面的效果是一样的
// f = r"\n" == "\\n";
//bool
bool g = true;
//List 数组
List<int> h = List();
h = [1, 2, 3];
h.forEach((element) {
print(element);
});
for (var value in h) {
print(value);
}
for (var i = 0; i < h.length; i++) {
print(i);
}
//数组与const
const List<int> j = [1, 2, 3];
//不行
// j.add(4);
// j = [1];
List<int> jj = const [1, 2, 3];
//不行,报错 const定位的是内存空间已不能修改
// jj.add(4);
// jj[2] = 2;
jj = [1];
//map 集合 const 与 list 一样
Map<int, int> map = {1: 1, 2: 2};
//修改
map[1] = 2;
//添加
map[3] = 3;
//null
print(map[4]);
map.forEach((key, value) {});
map.keys.forEach((element) {});
map.values.forEach((element) {});
//Runes 特殊字符标识类 Unicode32
var clapping = '\u{8F8F1}';
///5个16进制 需要使用{}
print(clapping); //👏
//获得 16位代码单元
print(clapping.codeUnits); //[55357, 56399]
//获得unicode代码
print(clapping.runes.toList()); //[128079]
//fromCharCode 根据字符码创建字符串
print(String.fromCharCode(128079));
print(String.fromCharCodes(clapping.runes));
print(String.fromCharCodes([55357, 56399]));
print(String.fromCharCode(0x1f44f));
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(String.fromCharCodes(input));
/**
* Symbols 标识符
*/
var aa = #sadsad;
switch (aa) {
case #A:
break;
case #sadsad:
break;
}
//操作符 as 强转
num q = 10;
int w = q as int;
// is 判断是什么类型 is!
bool ee = q is! int;
//赋值 += /= 等
// ??=
// k==null 的时候赋值
var k;
k ??= "11";
//三目表达式可以使用 if(true)?true:false
//条件表达式 k ==null v = 789 否则 v=k
var v = k ?? "789";
/**
* 级联操作符 双点 ..
*/
Build()
..a()
..b();
Build().c().d();
/**
* ?. 安全操作符 跟kotlin一样
*/
String str;
str?.length;
//方法 一等对象方法
//所有的方法都是对象,可以赋值给Function变量 Function不能知道方法的参数,类型,返回等
Function function = fun;
//参数不匹配
//function((int i,int j){});
//参数为匿名方法,闭包等名字
fun2((i, j) {});
}
void fun(Function f) {
f();
}
//定义F类型
typedef void F(int i, int j);
//写起来很麻烦
void fun1(F f) {
f(1, 1);
}
void fun2(void f(int i, int j)) {
f(1, 1);
}
class Build {
void a() {}
void b() {}
Build c() {
return this;
}
Build d() {
return this;
}
}
//回调类不用写了,直接使用方法为参数
typedef void onClick();
class Button {
void setOnClickListener(onClick listener) {
listener();
}
}
//可选位置参数
void main2() {
fun3();
fun3(1);
fun3(1, 2);
fun4();
fun4(i: 1, j: 2);
fun4(j: 2, i: 4);
}
//[] 可选位置参数 ,可以设置默认值,要按顺序传值
void fun3([int i = 1, int j = 2]) {}
//{} 可选命名参数,可以设置默认值,可以按名字传值
void fun4({int i = 1, int j = 2}) {}
//异常
void main3() {
try {
test();
} catch (e,s) {
//可以只有一个 e
//e,就是抛出的异常对象
print(e.runtimeType);
//s,是stacktrace 调用栈信息
print(s.runtimeType);
}
//捕获指定异常 on
try{
test();
}on Exception catch(e){
}on String catch(e){
}finally{
}
}
void test() {
// throw Exception("exception");
throw "exception";
}