Dart
变量 var
var
如果变量没有设置初始值,Dart 会将其推断为动态类型,允许赋值为任意类型的值。
var a; print (a); a = 'str' ; a = 666 ; a = true ; a = {}; a = []; print (a);
如果设置了初始值,只能设置和初始值同样的类型
var a = 'jay' ;a = 'hi' ; a = 888 ;
Object
动态任意类型
编译阶段检查类型
Object a = 'jay' ;a = 123 ; a = {}; a.p();
dynamic
动态任意类型
编译阶段不检查检查类型
dynamic a = 'jay' ;a = 123 ; a = []; a.p();
常量 const
const
const String a = 'jay' ;const b = 'jay' ;const a = 123 ;const b; const a = 123 ;a = 456 ; const b = DateTime .now(); const list = [1 , 2 , 3 ];list[1 ] = 4 ; const a1 = [11 , 22 ];const a2 = [11 , 22 ];print (identical(a1, a2));
final
final String a = 'jay' ;final b = 'jay' ;final a;print (a); a = 666 ; print (a);final b = 'jay' ;b = 'hi' ; final a = DateTime .now();const list = [1 , 2 , 3 ];list[1 ] = 4 ; final a1 = [11 , 22 ];final a2 = [11 , 22 ];print (identical(a1, a2));
数值 num
声明
int a = 1 ; double b = 0.1 ; num c = 123 ;
数值的转换
int a = int .parse("123" );double c = double .parse("1.1" );String d = 123. toString();String e = 1.1 .toString();int f = 1.1 .toInt();
布尔值 bool
字符串 String
声明
String str1 = 'jay,\'single\' "double"' ;String str2 = "jay,'single' \"double\"" ;
模版字符串
var a = 'jay' ;String b = 'hi, ${a} ' ; print (b);
字符串拼接
var a = 'hi' ',' ' jay' ;var b = 'hi' + ',' + ' jay' ;var c = 'hi' ',' ' jay' ; print (a); print (b); print (c); var str = ''' hi\n, jay ''' ;print (str);var str2 = r''' hi\n, jay ''' ;print (str2);
字符串方法
var a = 'hi, jay' ;print (a.contains('j' )); print (a.startsWith('hi' )); print (a.endsWith('jay' )); print (a.indexOf('jay' )); print (a.substring(1 ,5 )); var b = a.split(', ' );print (b); print (a.toLowerCase()); print (a.toUpperCase()); print (' HI, JAY ' .trim()); print ('' .isEmpty); print ('' .isNotEmpty); print (a.replaceAll('jay' , 'tom' )); StringBuffer ()..write('hi' ) ..write(',' ) ..write('jay. ' ) ..writeAll(['hi' , ',' , 'tom' ])
日期时间 DateTime
创建时间
var now = new DateTime .now();var datetime = new DateTime (2000 , 1 , 1 , 1 , 10 );var utc = DateTime .utc(2000 , 1 , 1 , 1 , 10 );
解析时间
var date = DateTime .parse('2000-01-01 06:30:00Z' );var date2 = DateTime .parse('2000-01-01 06:30:00+0800' );print (date); print (date2);
计算时间
var date = DateTime .now().add(Duration (days: 1 ));
比较时间
var now = DateTime .now();var date = now.add(Duration (days: 1 ));print (now.isAfter(date)); print (now.isBefore(date)); print (now.difference(date));
时间戳
var now = DateTime .now();print (now.millisecondsSinceEpoch); print (now.microsecondsSinceEpoch);
列表 List
定义列表
var list = [1 , 2 , 3 ];List <int > list2 = [];list2 ..add(1 ) ..add(2 ) ..add(3 ); var list = List <int >.filled(3 , 0 );list[3 ] = 666 ;
生成数据
var list = List .generate(3 , (i) => i + 1 );
属性
var list = [1 , 2 , 3 ];print (list.first); print (list.last); print (list.length); print (list.isEmpty); print (list.isNotEmpty); print (list.reversed);
方法
名称
说明
add
添加
addAll
添加多个
insert
插入
insertAll
插入多个
indexOf
查询
indexWhere
按条件查询
remove
删除
removeAt
按位置删除
fillRange
按区间填充
getRange
按区间获取
shuffle
随机变换顺序
sort
排序
sublist
创建子列表
List <int > list = [];list ..add(1 ) ..addAll([2 , 3 ]) ..insert(0 , 0 ) ..insertAll(4 , [4 , 5 ]); print (list.indexOf(2 )); print (list.indexWhere((i) => i > 2 )); print (list.indexWhere((i) { return i > 2 ; })); list.remove(4 ); print (list); list.removeAt(0 ); print (list); list.fillRange(1 , 3 , 66 ); print (list); print (list.getRange(1 , 3 )); list.shuffle(); print (list); list.sort(); print (list); list.sort(); print (list); list.sort((a, b) => b - a); print (list); List <DateTime > dtList = [];dtList.addAll([ DateTime .now(), DateTime .now().add(new Duration (days: -12 )), DateTime .now().add(new Duration (days: -2 )) ]); print (dtList); dtList.sort((a, b) => a.compareTo(b)); print (dtList); var l = [1 , 2 , 3 , 4 , 5 , 6 ];var sl = l.sublist(1 , 3 );print (sl); var l1 = [1 , 2 , 3 ];var l2 = [4 , 5 , 6 ];print (l1 + l2);
集合 Map
声明
var a = { 'key' : 'value' };
弱类型
var a = {};a['name' ] = 'jay' ; a['age' ] = 66 ; a[1 ] = 123 ; print (a);
强类型
var a = Map <String , String >();a['name' ] = 'jay' ; a['age' ] = 66 ; a[1 ] = 123 ; print (a);
属性
var a = { 'name' : 'jay' };print (a.isEmpty); print (a.isNotEmpty); print (a.keys); print (a.values); print (a.length); print (a.entries);
方法
名称
说明
addAll
添加
addEntries
从入口添加
containsKey
按 key 查询
containsValue
按 value 查询
clear
清空
remove
删除
removeWhere
按条件删除
update
更新某个
updateAll
按条件更新
var a = {};var b = { 'key' : 'value' };a.addAll({ 'name' : 'jay' , 'age' : 66 }); a.addEntries(b.entries); print (a.containsKey('name' )); print (a.containsValue(66 )); a.update('name' , (val) => 'tom' ); a.updateAll((key, val) => "值为:$val " ); a.remove('name' ); a.removeWhere((key,val) => key == 'key' ); a.clear();
集合 Set
声明
var a = Set ();var b = <dynamic >{};
去重
var list = ['tom' , 'jerry' , 'jay' , 'tom' ];var names = <dynamic >{};names.addAll(list); print (names); print (names.toList());
属性
var a = Set ();a.addAll(['tom' , 'jerry' , 'jay' ]); print (a.first); print (a.last); print (a.length); print (a.isEmpty); print (a.isNotEmpty);
方法
名称
说明
addAll
添加
contains
查询单个
containsAll
查询多个
difference
集合不同
intersection
交集
union
联合
lookup
按对象查询到返回对象
remove
删除单个
removeAll
删除多个
clear
清空
firstWhere
按条件正向查询
lastWhere
按条件反向查询
removeWhere
按条件删除
retainAll
只保留几个
retainWhere
按条件只保留几个
交集联合
var a = <String >{'jay' , 'tom' , 'jerry' , 'echo' };var b = <String >{'jay' , 'bob' , 'trump' , 'echo' };print (a.intersection(b)); print (a.union(b));
枚举 enum
声明
enum StatusType { success, error, failed, }
单行注释
多行注释
文档注释
函数 Function
定义
int add(int n) { return x + 1 ; } add(1 );
可选参数
int example(int a, [int b = 2 , int c = 3 ]) { return a + b + c; } example(1 ); example(1 , 3 ); example(1 , 3 , 5 );
命名参数
int example(int a, {int b = 2 , int c = 3 }) { return a + b + c; } example(1 ); example(1 , c: 5 ); example(1 , b: 3 ); example(1 , b: 3 , c: 5 );
返回函数
Function example(int a) { return (int b){ return a + b; }; } example(1 )(1 );
操作符
操作符
说明
expr++
expr--
()
.
?.
后缀操作
-expr
!expr
~expr
++expr
--expr
前缀操作
*
/
%
~/
乘除
+
-
加减
<<
>>
位移
&
按位与
^
按位异或
|
按位或
>=
>
<=
<
as
is
is!
类型操作
== !=
相等
&&
逻辑与
||
逻辑或
??
是否为空
expr1 ? expr2 : expr3
三目运算
..
级联
= *= /= ~/= %= += -= <<= >>= &= ^= |= ??=
赋值
上边 的优先级高于下边 的优先级,左边 的优先级高于右边 的优先级
类型判定操作符
操作符
说明
as
类型转换
is
如果对象是指定的类型返回 True
is!
如果对象是指定的类型返回 False
int n = 123 ;String str = 'jay' ;print (n as Object );print (str is String ); print (str is ! String );
三元运算
bool isTrue = true ;String str = isTrue ? 'T' : 'F' ;print (str);
流程控制
if else
String name = 'jay' ;bool b = true ;if (b) { print ('true' ); } else { print ('false' ); } if (name == 'jay' ) { print ('jay' ); }
for
var list = [1 , 2 , 3 , 4 , 5 ];for (var i = 0 ; i < list.length; i++) { print (i); }
while
int i = 0 ;while (i < 5 ) { print (i); i++; }
do while
bool isRunning = true ;do { print ('is running' ); isRunning = false ; } while (isRunning);
switch case
String name = 'jay' ;switch (name) { case 'jay' : print ('jay' ); break ; default : print ('not find' ); }
break
for (var i = 0 ; i < 5 ; i++) { if (i == 2 ) { break ; } print (i); } int i = 0 ;while (i < 5 ) { if (i < 2 ) { break ; } print (i); i++; }
continue
for (var i = 0 ; i < 5 ; i++) { if (i == 2 ) { continue ; } print (i); } String command = 'close' ;switch (command) { case 'open' : print ('open' ); break ; case 'close' : print ("close" ); continue doClear; case 'close2' : print ('close2' ); continue doClear; doClear: case 'doClose' : print ('doClose' ); break ; default : print ('other' ); }
错误处理 error
错误类型
名称
说明
DeferredLoadException
延迟加载错误
FormatException
格式错误
IntegerDivisionByZeroException
整数除零错误
IOException
IO 错误
IsolateSpawnException
隔离产生错误
TimeoutException
超时错误
名称
说明
AbstractClassInstantiationError
抽象类实例化错误
ArgumentError
参数错误
AssertionError
断言错误
AsyncError
异步错误
CastError
Cast 错误
ConcurrentModificationError
并发修改错误
CyclicInitializationError
周期初始错误
FallThroughError
Fall Through 错误
JsonUnsupportedObjectError
JSON 不支持错误
NoSuchMethodError
没有这个方法错误
NullThrownError
Null 错误错误
OutOfMemoryError
内存溢出错误
RemoteError
远程错误
StackOverflowError
堆栈溢出错误
StateError
状态错误
UnimplementedError
未实现的错误
UnsupportedError
不支持错误
抛出错误
throw new FormatException('这是一个格式错误提示' );throw new OutOfMemoryError();throw '这是一个异常' ;
捕获错误
try { throw new OutOfMemoryError(); } on OutOfMemoryError { print ('没有内存了' ); rethrow ; } catch (e) { print (e); } finally { print ('finally' ); }
类 class
声明
class Human { String name; num age; Map other; Human(this .name, this .age) : other = {'skin' : 'yellow' }; @override String toString() { return '$name , $age , $other ' ; } call(String msg) { print ('$msg ' ); } } void main() { var jay = Human('jay' , 18 ); print (jay); jay('hello world' ); }
命名构造函数
class Human { String name; num age; Map other; Human.fromJson(Map json) : name = json['name' ], age = json['age' ], other = {'skin' : 'yellow' , 'death' : json['age' ] + 100 }; @override String toString() { return '$name , $age , $other ' ; } } void main() { var jay = Human.fromJson({'name' : 'jay' , 'age' : 18 }); print (jay); }
重定向构造函数
class Human { String name; num age; Map other; Human(this .name, this .age) : other = {'skin' : 'yellow' }; Human.fromJson(Map json) : this (json['name' ], json['age' ]); @override String toString() { return '$name , $age , $other ' ; } } void main() { var jay = Human.fromJson({'name' : 'jay' , 'age' : 18 }); print (jay); }
get set 方法
class Human { String? _name; set name(String val) { _name = val; } String get name { return 'name is $_name ' ; } } void main() { var p = Human(); p.name = 'jay' ; print (p.name); }
静态变量
class Human { static String name = 'default name' ; static void printName() { print ('name is $name ' ); } } void main() { print (Human.name); Human.printName(); }
抽象类
abstract class Human { String name = 'default name' ; void printName() { print ('name is $name ' ); } } class Man extends Human {} class Woman implements Human { @override String name; Woman(this .name); @override void printName() { print ('this woman\'s name is $name ' ); } } var jay = Man();jay.printName(); var echo = Woman('echo' );echo.printName(); var p = Human();
实现多个抽象类
abstract class IHuman { String name = 'default name' ; String printName() { return 'name is $name ' ; } } abstract class ITools { String toolName = 'default toolName' ; String useTools() { return 'using tools' ; } } class Man implements IHuman , ITools { @override String name; String toolName; Man(this .name, this .toolName); @override String printName() { return 'This man\'s name is $name ' ; } @override String useTools() { return '$name using a $toolName ' ; } } void makeHumanInfo(IHuman p) => print (p.printName());void makeToolsInfo(ITools p) => print (p.useTools());void main() { var jay = Man('jay' , 'pen' ); print (jay.printName()); print (jay.useTools()); makeHumanInfo(jay); makeToolsInfo(jay); }
继承
class Human { String name; Human(this .name); void sayHi() { print ('hello' ); } void run() { print ('run' ); } void useTools() { print ('using tools' ); } } class Man extends Human { Man(String name) : super (name); @override void run() { super .run(); print ('this man can run' ); } @override void useTools() { print ('this man can use tools' ); } @override void noSuchMethod(Invocation mirror) { print ('noSuchMethod' ); } } void main() { var p = Man('jay' ); p.sayHi(); p.run(); p.useTools(); dynamic tom = Man('tom' ); tom.xxx(); }
工厂函数
调用子类
abstract class Human { void run(); void useTools(); factory Human(String gender) { switch (gender) { case 'man' : return Man(); case 'woman' : return Woman(); default : throw 'gender error' ; } } } class Man implements Human { @override void run() { print ('this man can run' ); } @override void useTools() { print ('this man can use tools' ); } } class Woman implements Human { @override void run() { print ('this woman can run' ); } @override void useTools() { print ('this woman can use tools' ); } } void main() { var man = Human('man' ); var woman = Human('woman' ); man.run(); man.useTools(); woman.run(); woman.useTools(); }
单例模式
class Human { static final Human _instance = Human._internal(); Human._internal(); factory Human() { return _instance; } void useTools() { print ('use tools' ); } } void main() { var p1 = Human(); var p2 = Human(); print (identical(p1, p2)); Human().useTools(); }
减少重复实例对象
class Human { String _name; Human(this ._name); factory Human.fromJson(Map <String , dynamic > json) => Human(json['name' ] as String ); void printName() { print ('$_name ' ); } } void main() { var p = Human.fromJson({'name' : 'jay' }); p.printName(); }
混入 mixin
mixin Animal { void sleep() { print ('Animal sleep' ); } } mixin Human { void sleep() { print ('Human sleep' ); } void useTools() { print ('Human use tools' ); } } mixin People on Human { void sleep() { super .sleep(); print ('People sleep' ); } void run() { print ('People run' ); } } class Man with Animal , Human , People {}void main() { var p = Man(); p.sleep(); p.run(); p.useTools(); }
泛型
声明
void main() { var str = <String >[]; str.add('hi' ); var map = <String , String >{}; map['a' ] = 'hi' ; }
函数泛型
V returnValue<K, V>(K key, V val) { return val; } void main() { returnValue('name' , 123 ); returnValue<String , int >('name' , 123 ); }
构造函数泛型
class Phone <T > { final T number; Phone(this .number); } void main() { var number = Phone('12333333' ); print (number); var number2 = Phone(123444445 ); print (number2); }
泛型约束
class Man { void sleep() { print ('Man sleep' ); } } class Human <T extends Man > { final T people; Human(this .people); } void main() { var p = Man(); var h = Human<Man>(p); h.people.sleep(); }
异步 async
异步回调
import 'dart:html' ; void main() { HttpRequest.getString( 'https://api.github.com/search/users?q=jay' , ).then((response) { print (response); }); }
async await
import 'dart:html' ; void main() async { final data = await HttpRequest.getString( 'https://api.github.com/search/users?q=jay' , ); print (data); }
生成器
同步生成器
Iterable <int > naturalsTo(int n) sync * { print ('start' ); int k = 0 ; while (k < n) { yield k++; } print ('end' ); } main() { var it = naturalsTo(3 ).iterator; it.moveNext(); print (it.current); it.moveNext(); print (it.current); it.moveNext(); print (it.current); it.moveNext(); }
异步生成器
import 'dart:async' ;Stream<int > asynchronousNaturalsTo(int n) async * { print ('start' ); int k = 0 ; while (k < n) { yield k++; } print ('end' ); } main() { StreamSubscription subscription = asynchronousNaturalsTo(3 ).listen(null ); subscription.onData((value) { print (value); }); }
递归生成器
Iterable <int > naturalsDownFrom(int n) sync * { print ('start' ); if (n > 0 ) { yield n; yield * naturalsDownFrom(n - 1 ); } print ('end' ); } main() { var it = naturalsDownFrom(3 ).iterator; it.moveNext(); print (it.current); it.moveNext(); print (it.current); it.moveNext(); print (it.current); it.moveNext(); }
类型定义 typedef
typedef MyMap = Map <String , String >;typedef MyList = List <int >;typedef MyAdd = int Function (int a, int b);class MyClass { MyAdd add; MyClass(this .add); } void main() { MyMap m = {'name' : 'jay' }; m['age' ] = '18' ; print (m); MyList list = [1 , 2 , 3 ]; list.add(4 ); print (list); MyAdd add = (a, b) => a + b; print (add(1 , 2 )); MyClass c = MyClass(add); print (c.add(6 , 6 )); }
空安全
可以为空
String? name;List <String >? list; List <String? > list2;
late
断言值不为为空
String? name;String userName = name!;
不为空时执行
??
String type = status ?? 'default' ;
拓展 extension
import 'package:intl/intl.dart' ;extension ExDateTime on DateTime { String toDateString({String format = 'yyyy-MM-dd' }) => DateFormat(format).format(this ); int get nowTicket => this .microsecondsSinceEpoch; } main() { var now = DateTime .now(); print (now.toDateString()); print (now.nowTicket); }
导入库 import
import 'dart:io' ;import 'package:intl/intl.dart' ;import 'package:demo_project/demo.dart' ;import 'package:demo_project/demo.dart' as d;import 'package:demo_project/demo.dart' show <package name>;import 'package:demo_project/demo.dart' hide <package name>;import 'package:demo_project/demo.dart' deferred as d;main() async { await d.loadLibrary(); }
通过 dart pub get
安装 pubspec.yaml 文件里的依赖