基础 抽象类(接口)
抽象类通常用来定义接口,以及部分实现。 在 Dart 中没有 interface 这个关键字,只有 abstract,所以可以使用 abstract 来生成接口:
1 2 3 4 5 6 7 8 9 abstract class Demo { void zhujiang(); }class Zhu implements Demo { @override void zhujiang() {} }
如果想 extents 多个类的话需要使用 with 关键字,可以多继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 abstract class Demo { void zhujiang(); }abstract class Demo2 { void zhujiang(); }abstract class Demo3 { void zhujiang(); }class Zhu extends Demo with Demo2 ,Demo3 implements Demo3 ,Demo2 { @override void zhujiang() {} }
变量的默认值
不要被之前的Java所禁锢,比如之前的Boolean值默认会是false,但是在Dart中的bool值默认也是null ,记着,一切皆对象,对象的默认值为null
num类型 int和double是num的子类
1 2 3 //int和double都是num的子类 num n1 = 1 num n2 = 1.0
dynamic ,var、object dynamic 所有 dart 对象的基础类型,在大多数情况下,不直接使用它通过它定义的变量会关闭类型检查,这意味着 dynamix x= ‘hal’; x.foo (); 这段静态类型检查不会报错,但是运行时会 crash,因为 x 并没有 foo() 方法,所以建议大家在编程时不要直接使用 dynamic;
var 是一个关键字,意思是”我不关心这里的类型是什么”,系统会自动判断类型 runtimeType;
object 是 Dart 对象的基类,当你定义: object o =xxx ;时这个时候系统会认为 o 是个对象,你可以调用 o 的 toString () 和 hashCode () 方法因为 Object 提供了这些方法,但是如果你尝试调用o.foo () 时,静态类型检查会运行报错。综上不难看出 dynamic 与 object 的最大的区别是在静态类型检查上。
构造函数 位置可选参数,只需要将可选参数放入中括号即可,例子如下; func_text (a, [b = 4]) { } 匿名函数 var a = (b, c){ return b + c; }; //一般构造方法的书写格式 Person (this. name, this. age);
freezed 1.1.0 深度拷贝,语法扩充
Get.off () 导航到下一个页面并删除前一个页面 Get.offAll () 导航到下一个页面并删除以前所有的页面
多构造函数
1 2 3 4 5 6 7 8 9 10 class FeeDetails { FeeDetails(this .title, this .content); FeeDetails.three(this .title,this .content,this .describe); String? content; String? describe; String? title; }
. then ()的用法
1 2 3 4 5 6 7 8 9 10 11 Future.wait([ Future.delayed(new Duration (seconds: 2 ), () { return "hello" ; }), Future.delayed(new Duration (seconds: 4 ), () { return " world" ; })]).then((results){ print (results[0 ]+results[1 ]);}).catchError((e){ print (e);});
可以使用三个单引号创建多行字符串对象
1 2 3 String d = '''ssss fffffffgg grrrr''' ;
定义函数时可省略类型 (不建议)
Dart中函数是Function类型的对象。所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。
支持缩写语法 => (Kotlin是用=来实现)
1 2 3 4 test ()=> "zhujiang" ;String test1 ( ){ return "zhujiang" ; }
函数别名 用typedef给函数起一个别名,使用比较方便。例如定义一个方法的回调,直接使用别名定义。没返回值,则只要参数匹配就行了,如果定义了返回值,则返回值不一样会报错。
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 typedef Fun1(int a, int b); typedef Fun2<T, K>(T a, K b);int add(int a, int b) { print ('a + b' ); return a + b; }class Demo1 { Demo1(int f(int a, int b), int x, int y) { var sum = f(x, y); print ("sum1 = $sum" ); } }class Demo2 { Demo2(Fun1 f, int x, int y) { var sum = f(x, y); print ("sum2 = $sum" ); } }class Demo3 { Demo3(Fun2<int , int > f, int x, int y) { var sum = f(x, y); print ("sum3 = $sum" ); } }
调用
1 2 3 Demo1 (fun1, 5 , 10 );Demo2 (add, 5 , 10 );Demo3 (add, 5 , 10 );
级联:.. 这个其实就是链式调用
1 2 StringBuffer stringBuffer = StringBuffer() stringBuffer..write("sss" )..write("ssss" )
Setter和Getter 在Java中get和set方法可以直接生成,在Dart中无需自己定义。每个实例变量都隐含的具有一个 getter, 如果变量不是 final 的则还有一个 setter。