代码一定要运行在main(){}中
定义变量可以二种方法
var a =100;
也可以 num d1 = 100
忽略制表符,原标输出:
String str = r"xxxxxxx \n xxxxxxx"
print(str )
格式转换,字符转数字
var one = int.parse('1');
assert(one == 1)
var onep = double.parse("1,2");
格式化转换数字转字符
Srting str1 = 1.toSrting()
带小数转换
Srting srt8 = 1.2223.toSrtingAsFixed(2) //保留二位
打印变量类型:
var a = "rr";
print('${a.runtimeType}');
【】例表:
assert([1,2,3,4] [1]==2);
assert([1,2,3,4].length == 3);
assert([].isEmpty == true);
assert([1].isEmpty == false);
list支持多种元素比如变量 list 布尔,数字,例:
var a = "5";
var b = true;
var c = [1,2,3,3];
var alist=[1,"aa",a,b,c];
打印运行内存时的变量类型:
var a = [1,2,3,4,5];
print('a[0] = ${a[0].runtimeType}');
列表循环列表方法:
var list =[1,2,3];
list.forEach((i){
print(i);
});
传参也可以是一个函数,比如下面代码!
var list = [1,2,3];
list.forEach(printList);
}
printList(name){
print(name);
——————————————————————————————————————————————————————————————
max类型 类同于js的对象,py的字典
var colos2 = new Map();
colors2['first']= "red";
colors2[second]="green";
也可以直接定义:
var color1 = {
'first':'xxx',
'third':'blue',
}
访问字典方法:
print(colors2['second']) // 返回某一项
print(${colors2.length}); //返回总长度
dart中的函数 函数前第一个是返回类型 ,可以用默认,参数中,可以指定数据类型 ,也可以用默认,第一个例子是标准写法:
Srting Hello(Srting name){
return 'hello $name';
}
简要写法:
hello(name){
return 'hello $name';
}
箭头函数写法:
不能复杂的语句,比如if 什么判断,只能写简半单的单条语句,几乎只能用表达式,var hello(name)=>a1+1 ,支持无名函名。
var foo=()=>'xxx';
print(foo());
闭包
——————————————————————————————————————————————————————————————————————————
当函数返回一个函数,而返回的函数又用到了上级函数的变量,形成一个相互引用的环,就这叫闭包,在内存中永远不被销毁、简单示例:
main(){
Function make(addby){
addby ++;
return (i)=>addby+i;
}
var add1 = make(2);
var add2 = make(5);
print(add1(3)); //返回6
print(add2(5)); //返回11
}
函数传参:fun(a,b,c) 本函数有三人个参数,用的时候少传多传都会报错
【】中括号代表位置参数
fun(a,[b,c,d]) [] 代表位置参数,不传参的话默认为null
func(a,[a=5,c="foo"])给位置参数传默认参数
以下例子:传参时只能了二个参数,实际调用时值为第三个有默认值 ,第四个没有值为null,所以结果为:1,2,3,null
funb(a,[b,c=3,d]){
print('$a,$b,$c,$d');
}
funb(1,2); // 1,2,3,null
{}代表命名参数,可有可无 用:冒号给默认值
func(a,{a:3,b:"ww"})
条件分支语句:条件分支语我句和别的语言几没有区别,只是功能更强大,支持指定跳转,类似于goto标记,不像python 只用一次方法解决,实现起来比较灵活
例:
int a = 0;
while(a>5){
a++;
print('$a');
}
例:
int b = 0;
do{
b++;
print('hello b = $b');
}while(b<0);
continue //退出本次
break //退出这段代码
————————————————————————————————————————————————————————————————
switch 例子:
switch("flutter"){
case 'jimmy':
print("no");
break;
case "flutter":
print("ok");
} //中间不加break会报错,不像其它语言会继椟往下走,纯报语法错误 !!!
————————————————————————————————————————————————————————————————————————————————————————
在使用枚举做值时,多少个值就要写多个case ,否则会报错,如果不想写完,可以定义其中一项为defalut
示例:
1 main() { 2 switch(color){ 3 case Color.red: 4 print("red"); 5 break; 6 default: 7 } 8 } 9 enum Color{ 10 red,green,blue 11 } 12 Color color = Color.red;
dart 支持goto 之类的跳转标志,以下代码示例:
1 main() { 2 xsy(); 3 } 4 enum Color{ //定义枚举 5 red,green,blue 6 } 7 Color color = Color.red; //初始化枚举值 8 xsy() { 9 switch (color) { 10 case Color.red: 11 print("Color.red"); 12 continue goBlue; //定义跳转目录 13 // break; 14 case Color.green: 15 break; 16 goBlue: // 跳转标志 17 case Color.blue: 18 print('Color.blue'); 19 break; 20 default: 21 } 22 }
异常捕获
main() {
goThrow();
}
void goThrow(){
try{
print("0");
getName();
}on Exception catch(e){
print('exception');
}
on NullThrownError catch(e){ // 接到了异常 catch 可以二个参数,一个行号,一个类型e
print("nuerror");
}
}
getName(){
if(true){
throw new NullThrownError(); // 定义抛出类型
}
}
_________________________________________________________________________________________
oop编程之 class 类
main() {
point p1 = new point(1, 2);
point p2 = new point.fromjson({});
print('p2.x=${p2.x}');
}
class point{ //自定义一个类
num x;
num y;
point(num x,num y){ //构造方法
this.x = x;
this.y = y;
} // 可简写成(print(this.x,this.y))
point.fromjson(Map json){ //命名函数实现重载
this.x = 5;
}
}
以上代码解释:
有时候需要多种初始化方法比如 同时出现void a(){...}, void a(int a){....},void a(int a,int b){......}
因为有时候需要传一个参,有些需要传二个参
dart不支持 重载,可以用命名构造函数来解决 point.fromjson(Map,json);类.名字,名字随意
//重定向构造函数:
有时候只想传一个参,但是又想用别的构造函数的方法可以使用重定向方法,重定向的不能使用括号{},不能写逻辑
//point.alongxAxis(num x) : this.fromjson(1,2,3);
父类构构函数 附继承方法:
class person{
person(int a){} //假设这儿有一个只传一个参的构造
person.fromjson(int a){}
}
class pointA extends person{
num x;
num y;
num z;
point2(this.x,this.y):super(x); 冒号能继承父类的构造
points.fromjson(int a, int b, int c){this.x =a; this.y = b};
}
//point.alongxAxis(num x) : this.fromjson(1,2,3);
//初始化例表:
class point3{
final num x;
final num y;
final num z;
point3(x,y):this.x=x;y=y,z=x+y;
}
dart中的异步
————————————————————————————————————————————————————————
dart 运行时分为一个主进程,一个微程,一个事件进程,主进程先运行扫描一次,然后运行微进程 ,然后监听事件,又然后扫描微进程,在微进程和
事件进程中切换 当使用了async await 就表则自动注册了事件进程,本函数返回数返回值为Futuer类型,也就是往事件队列加入一个列表,
可以显示申明本函数类型和隐式申明
显示:
FuturegetName()async{
await getxxxx();
print('xxxxxxxxxxxxxxx')
return 123; // 返回一个数值,不一定要这样做
}
隐式:
getName()async{
await getxxxx();
print("xxxxxxxxxxxxxxxxxxx");
}
事件队列排序
getfoo1().then(()=>getfoo3()).then(()=>getfoo2());
回调方法事件排序:
getfoo3().whenComplete((){
getfoo2.whenComplete((){
getfoo1();
})
})
数组列表方式:
Futuer.wait([foo(),fxx(),fzz()]).then(List list){
list.forEach((i)=print(i))
}
异步事件异常
在事件队列中抛出异常:
void goThrow(){
new Future(()=>print('start')).then((_)=>new Future.error('xxxxx'));
.catchError((e)=>print(e))
}
用whenComplete()方法例子:
void goThrow(){
new Future(()=>print('start')).then((_)=>new Future.error('xxxxx'));
.whenComplete(()=>print("finally"));
.then(()=>print("don\t"));//这句代码由于上句出错了,所以这句是运行不了的,代码也经出错
.catchError((e)=>print(e));
}
混合类型异常(同步和异步都有的代码怎么捕异常)
main(){
func3().catchError((e)){
print('e = $e');
});
}
fun1(){
throw 'func1 is error';
}
fun2(){
throw "xxxxxxxxxxxxxx";
}
加了Future 就是异步 以下代码运行不 了,,必须要加sync 关健字才能捕
Future fun3(){
fun1();
return new Future((){
fun2();
});
} //错误 代码
正确方法之一:
Future fun3(){
return new Future.sync((){
fun1();
return new Future((){ //本代码因为上面出错,这儿运行不了的,
fun2();
})
})
}
正确方法之二:
Future func3() async{
fun1()
return new Futurn((){
fun2();
})
}