Dart支持泛型,例如List表示任意类型对象组成的列表
变量
-
1、使用var 声明变量,可以赋予不同类型的值,var可以在运行中推导出变量的类型,确定了便不能更改类型
-
2、使用Object,这个关键字大家应该都很熟悉,Java中的所有对象的父类就是Object,Object和var不同的点是即使赋了初始值,也可以指定别的类型,例如int,String,Num等。
-
3、dynamic 和Object非常类似,唯一的区别就是如果你调用一个本身不存在的方法,Object会在编译器就直接报错,而dynamic则会在运行的时候才会抛出异常
| |
| var name = 3; |
| name = "Bob"; |
| |
| Object a = 'blob'; |
| a = 123; |
| a = []; |
| |
| dynamic _name = 'Bob'; |
| _name = 3; |
| |
| Object testa = "asd"; |
| |
| |
| dynamic testdy = "restdy"; |
| print(testdy.substring(1)); |
| |
常量
- 常量在dart中可以用final和const来修饰
- final包含了const的功能,区别在于
1、final可以接受运行时的数据,const则只能接受编译时的数据
2、const 必须给一个明确的编译常量值(即编译期间就确定的值),final 可以一开始不赋值。
3、final 是惰性初始化,运行时第一次使用前才进行初始化
4、const在修饰类中变量时,则必须加上static变量
| |
| final time = DateTime.now(); |
| |
| |
| |
| |
| |
| const atest = 1; |
| const btest = atest > 1 ? 2 : 1; |
| |
| var atest2 = 1; |
| |
| |
| |
| |
| |
| const aConstNum = 0; |
| const aConstBool = true; |
| const aConstString = 'a constant string'; |
| |
| var aNum = 0; |
| var aBool = true; |
| var aString = 'a string'; |
| const aConstList = [1, 2, 3]; |
| const validConstString = '$aConstNum $aConstBool $aConstString'; |
| |
| |
| |
| var validConstString2 = '$aNum $aBool $aString $aConstList'; |
| print(validConstString2); |
| |
| |
| |
| |
| |
| final testfinal; |
| testfinal = "3"; |
| |
| |
| class Test{ |
| const String name="jack"; |
| |
| |
| void getString(){ |
| const String name2="jack"; |
| } |
| |
| } |
5、final 只可用来修饰变量, const 关键字不仅仅用来定义常量,还可以用来创建常量值,该常量值可以赋予给任何变量。也可以将构造函数声明为 const,这种类型的构造函数创建的对象是不可改变的。
6、const 修饰对象时,要在构造方法加const
| |
| var foo = const [1,2,3]; |
| |
| |
| |
| |
| final bar = [1,3,4]; |
| bar[0] = 9; |
| print("bar:${bar}"); |
| |
| |
| final barconst = const []; |
| |
| |
| const baz = []; |
| baz.add("value"); |
| print(baz); |
| |
| |
| |
| |
| |
| const p1 = const Person('myname'); |
| const p2 = Person('myname'); |
| var p3 = const Person("myname"); |
| |
| print("---------${identical(p1, p2)}"); |
| print("---------${identical(p1, p3)}"); |
- 关于identical函数(检查两个引用是否指向同一个对象。)
| |
| var o = new Object(); |
| var isIdentical = identical(o, new Object()); |
| isIdentical = identical(o, o); |
| isIdentical = identical(const Object(), const Object()); |
| isIdentical = identical([1], [1]); |
| isIdentical = identical(const [1], const [1]); |
| isIdentical = identical(const [1], const [2]); |
| isIdentical = identical(2, 1 + 1); |
关键字

- 带有上标1的是上下文关键字,仅在特定位置具有含义。它们是可以在任何地方作为标识符。
- 带有上标2的单词是内置标识符。为了简化将JavaScript代码移植到Dart的任务,这些关键字在大多数地方都是有效的标识符,但它们不能用作类或类型名称,也不能用作导入模块时的前缀。
- 带有上标3的单词是与Dart 1.0发布后添加的异步支持相关的关键字。
part和part of
这个关键字可以把文件分成多个文件,将一个大的lib拆分成多个小的文件
注意part跟part of 要配套使用
part "B.dart"//指明B是A的一部分
part of "A.dart"//指明B是属于A的一部分
运算符

| |
| var a = 1; |
| int? b; |
| print(b); |
| b ??= 2; |
| print(b); |
| a += 0; |
| print(a); |
| |
| |
| |
| print(a + b); |
| print(a - b); |
| print(a * b); |
| print(a / b); |
| print(a % b); |
| print(a ~/ b); |
| |
| |
| |
| |
| |
| |
| print("========关系运算符========"); |
| |
| |
| print(a == b); |
| print(a >= b); |
| print(a "zhujiang"; |
| String test1(){ |
| return "zhujiang"; |
| } |
| |
| |
| main() { |
| print(add(a: 1, b: 3)); |
| } |
| |
| int add({int a = 1, int b = 0}) { |
| return a + b; |
| } |
| |
| int add2(int a,[int b = 2,int c = 3]) { |
| return a + b; |
| } |
| print(add2(1)); |
| print(add2(1,2)); |
| print(add2(1,1,3)); |
| |
| int add2([int b = 2,int c = 3],int a) { |
| return a + b; |
| } |
| int add3(int c,{int a = 1, int b = 0}) { |
| return a + b; |
| } |
匿名函数
| |
| var printFun = () => print("**无参匿名函数**"); |
| |
| |
| var printFun2 = (name) => print("**有参匿名函数 $name**"); |
| printFun2("sss"); |
闭包
- Dart内也有闭包的定义,这和JavaScript相似
| Function makeAddFunc(int x) { |
| return (int y) => x + y; |
| } |
| var makeAddFun = makeAddFunc(11); |
| |
| void main(){ |
| print(makeAddFun(10)); |
| } |
词法作用域
- Dart 的作用域是词法作用域,跟 JavaScript 一样,在写代码的时候就确定了。
| void test1(){ |
| var a = 2; |
| void test2(){ |
| var b = 3; |
| print(a); |
| } |
| } |
逻辑控制
| |
| for (var i = 0; i 0) { |
| print(while1); |
| while1--; |
| } |
| print("======do-while======"); |
| |
| var i = 5; |
| do { |
| print(i); |
| i--; |
| } while (i > 0); |
| |
| |
| |
| |
| |
| |
| print("====异常-捕获====="); |
| |
| |
| |
| try { |
| |
| |
| |
| |
| |
| int i = 3~/0; |
| print(i); |
| } on Exception catch (e) { |
| print('this is Unknown exception $e'); |
| |
| rethrow; |
| |
| |
| |
| } catch (e,s) { |
| print('No specified type, handles all error $e'); |
| print('Stack trace:\n $s'); |
| }finally{ |
| print("finally "); |
| } |
| |
| |
| |
Dart面向对象
类与对象
- 构造函数
- 命名构造函数
- 常量构造函数
- 工厂构造函数
- Getter和Setter
| |
| class Point { |
| num x; |
| num y; |
| Point(this.x, this.y); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| final String? name; |
| final int _age; |
| const Person(this.name, this._age); |
| |
| static Person? instance; |
| factory Person.getInstance(){ |
| if(instance == null){ |
| instance = Person("name", 31); |
| } |
| return instance as Person; |
| } |
| } |
| |
get和set
| class Rect { |
| int height; |
| int width; |
| Rect(this.width, this.height); |
| |
| get area { |
| return this.height * this.width; |
| } |
| |
| set h(int value) { |
| print("当你调用 xx.h 时,会打印这段话,表示你已经被监听到了"); |
| this.height = value; |
| } |
| |
| set w(int value) { |
| this.width = value; |
| } |
| } |
| |
| void main(List args) { |
| var p = Rect(10, 20); |
| print(p.area); |
| p.h = 100; |
| p.w = 100; |
| print(p.area); |
| } |
| |
静态成员
Dart泛型
| show(T a){ |
| print(a); |
| } |
| void main(List args) { |
| show("hello"); |
| |
| var p = My(); |
| p.say(3); |
| } |
| class My{ |
| say(T a){ |
| print(a); |
| } |
| } |
| |
相关资料
Dart官网教程
Dart在线编辑器
掘金中的Dart相关文章
掘金中的Dart相关文章2:Dart从入门到放弃
Dart关键字说明
flutter1
flutter2\