Dart 数据类型 内置基础数据类型
变量和常量
Dart中定义变量有两种方式,一种是静态类型语言常用的方式,显式指定变量类型,另一种则是动态语言的常用方式,不指定类型,由vm自动推断。
定义变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 String name = "张三" ;num age = 18 ;var address = "大道" ;var id = 100 ;var number = 20 ;number = "2020" ;
如想动态改变变量的数据类型,应当使用dynamic或Object来定义变量。
1 2 3 4 5 6 7 8 9 dynamic var1 = "hello" ;var1 = 19 ; print (var1); Object var2 = 20 ;var2 = "ce" ; print (var2);
定义常量
Dart中定义常量也有两种方式,一种使用final关键字, 一个 final 变量只能赋值一次;另一种是使用const关键字定义。
1 2 3 4 5 6 7 8 final height = 10 ;const pi = 3.14 ;final time = new DateTime .now(); const time1 = new DateTime .now();
需要注意,final定义的常量是运行时常量,而const常量则是编译时常量,也就是说final定义常量时,其值可以是一个变量,而const定义的常量,其值必须是一个字面常量值
内置类型的常用操作 数值类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var one = int .parse('1' );var onePointOne = double .parse('1.1' );String oneAsStr = 1. toString();String piAsStr = 3.14159 .toStringAsFixed(2 ); var as1=0 /0 ;if (as1.isNaN){ print ('是Nan' ); }else { print ('不是Nan' ); }
字符串类型 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 35 36 37 38 39 40 var s1 = "hello" ;var s2 = 'world' ;var multiLine1 = """你可以像这样,创建一个 包含了多行的字符串内容 """ ;var multiLine2 = '''你也可以使用三个单引号,创建一个 包含了多行的字符串内容 ''' ;var path = r'D:\workspace\code' ;var greet = "hello" + " world" ;var name = "王五" ;var aStr = "hello,${name} " ;print (aStr); var aStr2 = "hello,$name " ; var str1 = "to" ;var str2 = "click ${str1.toUpperCase()} " ;print (str2); var str = "" ;if (str.isEmpty){ print ("为空" ); }else { print ("不为空" ); }
布尔类型
Dart中的布尔类型仅有false、true两个值,不能使用0、非0或者null、非null来表达false和true。布尔类型的默认值为null
列表类型
Dart中列表操作与JavaScript中的数组相似。
常用的属性
属性
作用
length
长度
isEmpty
判断是否为空列表
isNotEmpty
判断不是为空列表
reversed
列表反转
常用的方法
方法
作用
add(“xxx”)
添加一个
addAll([‘xxx’,’xx’])
添加多个
indexOf(‘xxx’)
从列表查找,找到返回列表的索引,找不到返回-1
remove(‘xxx’)
删除 传入具体值
removeAt(index)
删除 传入索引值
fillRange(start,end,value)
修改
insert(index,value)
指定位置插入
insertAll(index,list)
指定位置插入list
toList()
其他类型 转换为List
join(‘x’)
list 转换为字符串,以什么分割
split(‘x’)
字符串转list,以什么分割
forEach
循环
map
List的循环
where
满足条件的返回一个集合,不符合返回()
any
list中有一个满足条件的返回true否则返回false
every
list中全部满足条件的返回true否则返回false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var list = [1 , 2 , 3 ];print (list[0 ]);print (list.length);list.add(5 ); list myList = [1 ,2 ,3 ,4 ,5 ,1 ,2 ,3 ]; var s = new Set ();s.addAll(myList); var setList = s.toList();print (setList)var constantList = const [1 , 2 , 3 ];constantList[1 ] = 1 ;
映射类型
Dart中映射操作与JavaScript中的对象相似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var gifts = { 'first' : 'partridge' , 'second' : 'turtledoves' , 'fifth' : 'golden rings' }; var pic = new Map ();pic['first' ] = 'partridge' ; pic['second' ] = 'turtledoves' ; pic['fifth' ] = 'golden rings' ; print (pic.length);pirnt(pic["first" ]); print (pic["four" ]);
函数
在Dart中,函数(或方法) 也是对象,它的类型是 Function。 这意味着,函数可以赋值给变量,也可以当做其他函数的参数。
定义函数 1 2 3 4 5 6 7 8 String greet(String name){ return "hello,$name " ; } greet(name){ return "hello,$name " ; }
要注意,函数也是对象,所有函数都有返回值。当没有指定返回值的时候,函数会返回null。当然,如果你强行使用void来修饰函数,则函数真的没有返回值
函数的参数
Dart中支持两种可选参数
命名参数位置
参数位置不可变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 add({int x, int y=1 , int z=0 }){ print (x + y + z; } add(x:1 ); add(x:12 , y:2 , z:10 ); add1(int x, [int y, int z = 2 ]) { int result = x + z; if (y != null ) { result = result + y; } print (result); } add1(0 ); add1(0 , 2 ); add1(0 , 2 , 3 );
匿名函数 1 2 3 4 var func = (x,y){ return x + y; }; print (func(1 ,12 ));
箭头函数
与JavaScript 的相同
1 add2(num x, num y) => x + y;
运算符 算术运算符 +、-、*、/、% ~/
和其他语言一样 多一个 ~/ 作用相除后的结果取整返回
类型判定运算符
操作符
作用
as
类型转换
is
数据类型判断
is!
数据类型判断取反
1 2 3 4 5 6 if (emp is Person) { emp.firstName = 'Bob' ; } (emp as Person).firstName = 'Bob' ;
赋值操作符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a = value; a += b; b ??= value; var s; print (s); print (s ?? 'str' ); s ??= 'string' ; print (s);
级联操作符
假如类Person有三个方法,setName、setAge、getName则可如下调用
1 new Person()..setName("Bob" )..setAge(20 )..getName();
循环语句
支持 for in 、forEach 用法和JavaScript 相同
类和对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Person { String name; int age; Person(String name, int age) { this .name = name; this .age = age; } } class Person { String name; int age; Person(this .name, this .age); }
Dart中没有private、public这些成员访问修饰符。如果是类私有的成员,不希望外面访问,只需要在成员变量之前加上一个下划线_变为私有即可
Getters 和 Setters方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Person { String userName; Person(this .userName); String get name{ return "user:" + this .userName; } set name(String name){ this .userName = name; } } void main() { var p = new Person("zhangsan" ); print (p.name); p.name = "lisi" ; print (p.name); }
类的继承 关键字(extends)
Dart中的继承可以使用关键字extends继承父类,使用关键字super引用父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Father { myFunction(){ } } class Son extends Father { @override myFunction(){ super .myFunction(); } }
类的多继承 关键字(with) 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 35 36 37 38 39 40 41 42 43 44 class Father1 { a(){ print ("this is a func" ); } Father(){ print ("Father1" ); } } class Father2 { b(){ print ("this is b func" ); } Father(){ print ("Father2" ); } } class Father3 { c(){ print ("this is c func" ); } Father(){ print ("Father3" ); } } class Son with Father1 Father2 ,Father3 {} void main() { var obj = new Son(); obj.Father(); obj.a(); obj.b(); obj.c(); }
接口抽象 抽象类 关键字(abstract)
抽象类是不能被实例化的,子类继承抽象类时,必须实现全部抽象方法。
1 2 3 4 abstract class DataBase { func1(); func2(); }
隐式接口 关键字(implements)
实际上在Dart中,每个类都隐式的定义了一个包含所有实例成员的接口, 并且该类实现了这个接口。 如果我们想实现某个接口,但有又不想继承,则可以使用这种隐式接口机制。我们需要用到关键字implements
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class People { void greet(){ print ("Hello" ); } } class Student implements People { @override void greet(){ print ("Hi,I'm wangwu." ); } } greet(People p){ p.greet(); } void main() { greet(new Student()); }
泛型 1 2 3 4 5 6 7 8 9 var names = new List <String >();names.add("zhangsan" ) var maps = new Map <int , String >();maps[1 ]="lisi" ; var infos = <String >['zhangsan' , 'lisi' , 'wangwu' ];
库的使用 1 2 3 4 5 6 7 8 9 import 'dart:math' ;import 'lib/student/student.dart' ;import 'package:utils/utils.dart' ;
导入库时,可以使用as关键字来给库起别名,避免命名空间冲突。
1 2 3 4 5 6 7 import 'package:lib1/lib1.dart' ;import 'package:lib2/lib2.dart' as lib2;Element element1 = new Element ();lib2.Element element2 = new lib2.Element ();
使用show和hide关键字控制库中成员的可见性
1 2 3 4 5 import 'package:lib1/lib1.dart' show foo;import 'package:lib2/lib2.dart' hide foo;
为了减少 APP 的启动时间,加载很少使用的功能,我们还可以延迟导入库。使用 deferred as关键字延迟导入
1 2 3 4 import 'package:deferred/hello.dart' deferred as hello;hello.loadLibrary();
异步编程
使用 async 和 await关键字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import 'dart:io' ;doTask() async { await sleep(const Duration (seconds:2 )); return 'xx' ; } test() async { var r = await doTask(); print (r); } void main(){ print ("main start" ); test(); print ("main end" ); }