├── .packages ├── .vscode └── launch.json ├── 04-变量的两种类型 └── variables.dart ├── 05-常量 └── constant.dart ├── 06-数值 └── number.dart ├── 07-布尔 └── bool.dart ├── 08-字符串 └── string.dart ├── 09-日期时间 └── datetime.dart ├── 10-列表 └── list.dart ├── 11-Map └── map.dart ├── 12-Set └── set.dart ├── 13-Runes └── runes.dart ├── 14-symbol-enum-comments └── symbol-enum-comments.dart ├── 15-函数-function └── function.dart ├── 16-操作符 └── operator.dart ├── 17-流程控制语句 └── controlFlow.dart ├── 18-异常 └── exception.dart ├── 19-类 ├── abstract.dart ├── class.dart ├── getset.dart ├── interface.dart └── static.dart ├── 24-继承 ├── 1-实现继承.dart ├── 2-继承抽象类的问题.dart ├── 3-父类调用.dart ├── 4-调用父类构造.dart └── 5-重写超类函数.dart ├── 25-多类继承 ├── 函数冲突.dart └── 多继承类.dart ├── 26-工厂模式 ├── 工厂函数.dart └── 工厂构造函数.dart ├── 27-库 ├── phone.dart ├── phone1.dart ├── 前缀.dart ├── 导入文件.dart ├── 延迟.dart ├── 核心库.dart ├── 第三方库.dart └── 筛选.dart ├── 28-泛型 ├── 构造函数泛型.dart ├── 泛型使用.dart ├── 泛型函数.dart └── 泛型限制.dart ├── 29-异步 ├── 异步调用-回调.dart ├── 异步调用-等待.dart └── 异步返回值.dart ├── 30-生成器 ├── 同步生成器.dart ├── 异步生成器.dart └── 递归生成器.dart ├── 31-可调用类 └── callable.dart ├── 32-隔离 └── isolates.dart ├── 33-类型信息 ├── nouse.dart └── typedef.dart ├── 34-媒体信息 ├── deprecated.dart ├── override.dart ├── proxy.dart └── todo.dart ├── README.md ├── pubspec.lock └── pubspec.yaml /.packages: -------------------------------------------------------------------------------- 1 | # Generated by pub on 2018-12-05 10:18:06.655551. 2 | cookie_jar:file:///Users/hans/.pub-cache/hosted/pub.flutter-io.cn/cookie_jar-0.0.7/lib/ 3 | dio:file:///Users/hans/.pub-cache/hosted/pub.flutter-io.cn/dio-1.0.9/lib/ 4 | ducafecat:lib/ 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Dart", 9 | "program": "${file}", 10 | "request": "launch", 11 | "type": "dart" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /04-变量的两种类型/variables.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 弱类型 3 | // var a; 4 | // a = 'ducafecat'; 5 | // a = 123; 6 | // a = true; 7 | // a = {'key': 'val123'}; 8 | // a = ['abc']; 9 | // print(a); 10 | 11 | 12 | // 动态定义 dynamic 13 | // dynamic a = 'doucafecat'; 14 | // a = 123; 15 | // a = [1111]; 16 | // a.p(); 17 | // print(a); 18 | 19 | 20 | // 动态定义 Object 21 | // Object a = 'doucafecat'; 22 | // a = 123; 23 | // a = [2222]; 24 | // a.p(); 25 | // print(a); 26 | 27 | 28 | // 比较 var、dynamic、Object 29 | // var a = 'ducafecat'; 30 | // dynamic a = 'doucafecat'; 31 | // Object a = 'doucafecat'; 32 | // a = 123; 33 | // print(a); 34 | 35 | 36 | // 强类型 37 | // String a; 38 | // a = 'ducafecat'; 39 | // a = 123; 40 | // print(a); 41 | 42 | 43 | // 常用强类型 44 | // String a = 'doucafecat'; 45 | // int i = 123; 46 | // double d = 0.12; 47 | // bool b = true; 48 | // DateTime dt = new DateTime.now(); 49 | // List l = [ a, i, d, b, dt]; 50 | // print(l); 51 | 52 | 53 | // 默认值 54 | // var a; 55 | // String a; 56 | // print(a); 57 | // assert(a == null); 58 | } 59 | -------------------------------------------------------------------------------- /05-常量/constant.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 类型声明可以省略 3 | // final String a = 'ducafecat'; 4 | // final a = 'ducafecat'; 5 | // 6 | // const String a = 'ducafecat'; 7 | // const a = 'ducafecat'; 8 | 9 | 10 | // 初始后不能再赋值 11 | // final a = 'ducafecat'; 12 | // a = 'abc'; 13 | // 14 | // const a = 'ducafecat'; 15 | // a = 'abc'; 16 | 17 | 18 | // 不能和 var 同时使用 19 | // final var a = 'ducafecat'; 20 | // const var a = 'ducafecat'; 21 | 22 | 23 | // const 赋值 申明可省略 24 | // const List ls = const [11, 22, 33]; 25 | // const List ls = [11, 22, 33]; 26 | 27 | 28 | // 比较 1 - 需要确定的值 29 | // final dt = DateTime.now(); 30 | // print(dt); 31 | // 32 | // const dt = const DateTime.now(); 33 | // print(dt); 34 | 35 | 36 | // 比较 2 - 不可变性可传递 37 | // final List ls = [11, 22, 33]; 38 | // ls[1] = 44; 39 | // print(ls); 40 | // 41 | // const List ls = [11, 22, 33]; 42 | // ls[1] = 44; 43 | // print(ls); 44 | 45 | 46 | // 比较 3 - 内存中重复创建 47 | // final a1 = [11 , 22]; 48 | // final a2 = [11 , 22]; 49 | // print(identical(a1, a2)); 50 | // 51 | // const a1 = [11 , 22]; 52 | // const a2 = [11 , 22]; 53 | // print(identical(a1, a2)); 54 | 55 | } 56 | -------------------------------------------------------------------------------- /06-数值/number.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 数值类型 int、double、num 3 | // int a = 1; 4 | // double b = 1.2; 5 | // num c = 1.3; 6 | // print([a, b, c]); 7 | 8 | 9 | // 数值表示法 十进制、十六进制 10 | // int a = 1001; 11 | // int b = 0xABC; 12 | // print([a, b]); 13 | 14 | 15 | // 科学计数法 16 | // num a = 21.2e3; 17 | // print([a]); 18 | 19 | 20 | // 数值转换 21 | 22 | // string -> int 23 | // string -> double 24 | // int a = int.parse('123'); 25 | // double b = double.parse('1.223'); 26 | 27 | // int -> string 28 | // double -> string 29 | // String a = 123.toString(); 30 | // String b = 1.223.toString(); 31 | // print([a, b]); 32 | 33 | // double -> int 34 | // double a = 1.8; 35 | // int b = a.toInt(); 36 | // print(b); 37 | 38 | 39 | // 位运算 40 | 41 | // & 与运算, 当 a b c 都为 z 的时候通过 42 | // var a = 123; 43 | // var b = 123; 44 | // var c = 123; 45 | // var z = 123; 46 | // var result = a & b & c; 47 | // print(result); 48 | 49 | // | 或运算 , 可以用在常量组合 50 | // const USE_LEFT = 0x1; 51 | // const USE_TOP = 0x2; 52 | // const USE_LEFT_TOP = USE_LEFT | USE_TOP; 53 | // var result = USE_LEFT | USE_TOP; 54 | // print(result); 55 | // assert(USE_LEFT_TOP == result); 56 | 57 | // ~ 非运算 取反 58 | // var a = -1; 59 | // print(~a); 60 | 61 | // ^ 异或 ,可以用来取反色 62 | // var a = 123; 63 | // var b = 100; 64 | // print(a ^ b); 65 | 66 | // << 左移 67 | // var a = 10 << 1; 68 | // print(a); 69 | 70 | // >> 右移 71 | // var a = 10 >> 1; 72 | // print(a); 73 | 74 | } -------------------------------------------------------------------------------- /07-布尔/bool.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 声明,默认值 3 | // bool a; 4 | // print(a); 5 | 6 | 7 | // assert 断言 8 | // var a = true; 9 | // assert(a); 10 | // var name = ''; 11 | // assert(name.isEmpty); 12 | // assert(name.isNotEmpty); 13 | // var num = 0 / 0; 14 | // assert(num.isNaN); 15 | 16 | 17 | // 只有 true 对象才被认为是 true。 所有其他的值都是 flase。 18 | // String name = 'ducafecat'; 19 | // if(name) { 20 | // print('this is name'); 21 | // } 22 | 23 | 24 | // 逻辑运算符 25 | 26 | // && 逻辑与 27 | // bool a = true; 28 | // bool b = true; 29 | // assert(a && b); 30 | 31 | // || 逻辑或 32 | // bool a = true; 33 | // bool b = false; 34 | // assert(a || b); 35 | 36 | // ! 逻辑非 37 | // bool a = true; 38 | // bool b = !a; 39 | // print(b); 40 | 41 | // 关系运算符 42 | // var a = 1; 43 | // var b = 2; 44 | 45 | // == 等于 46 | // if(a == b) {} 47 | 48 | // != 不等于 49 | // if(a != b) {} 50 | 51 | // > 大于 52 | // if(a > b) {} 53 | 54 | // >= 大于或等于 55 | // if(a >= b) {} 56 | 57 | // < 小于 58 | // if(a < b) {} 59 | 60 | // <= 小于或等于 61 | // if(a <= b) {} 62 | 63 | } 64 | -------------------------------------------------------------------------------- /08-字符串/string.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 单引号或者双引号 3 | // String a = 'ducafecat'; 4 | // String b = "ducafecat"; 5 | 6 | 7 | // 字符串模板 ${expression} 表达式 8 | // var a = 123; 9 | // String b = 'ducafecat : ${a}'; 10 | // print(b); 11 | 12 | 13 | // 字符串连接 14 | // var a = 'hello' + ' ' + 'ducafecat'; 15 | // var a = 'hello'' ''ducafecat'; 16 | // var a = 'hello' ' ' 'ducafecat'; 17 | // var a = 'hello' 18 | // ' ' 19 | // 'ducafecat'; 20 | // var a = ''' 21 | // hello word 22 | // this is multi line 23 | // '''; 24 | // var a = """ 25 | // hello word 26 | // this is multi line 27 | // """; 28 | // print(a); 29 | 30 | // 转义符号 31 | // var a = 'hello word \n this is multi line'; 32 | // print(a); 33 | 34 | // 取消转义 raw 字符串 35 | // var a = r'hello word \n this is multi line'; 36 | // print(a); 37 | 38 | // 搜索 39 | // var a = 'web site ducafecat.tech'; 40 | // print(a.contains('ducafecat')); 41 | // print(a.startsWith('web')); 42 | // print(a.endsWith('tech')); 43 | // print(a.indexOf('site')); 44 | 45 | // 提取数据 46 | // print(a.substring(0,5)); 47 | // var b = a.split(' '); 48 | // print(b.length); 49 | // print(b[0]); 50 | 51 | // 大小写转换 52 | // print(a.toLowerCase()); 53 | // print(a.toUpperCase()); 54 | 55 | // 裁剪 判断空字符串 56 | // print(' hello word '.trim()); 57 | // print(''.isEmpty); 58 | 59 | // 替换部分字符 60 | // print('hello word word!'.replaceAll('word', 'ducafecat')); 61 | 62 | // 字符串创建 63 | // var sb = StringBuffer(); 64 | // sb..write('hello word!') 65 | // ..write('my') 66 | // ..write(' ') 67 | // ..writeAll(['web', 'site', 'https://ducafecat.tech']); 68 | // print(sb.toString()); 69 | 70 | } -------------------------------------------------------------------------------- /09-日期时间/datetime.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 声明 3 | // var now = new DateTime.now(); 4 | // print(now); 5 | // var d = new DateTime(2018, 10, 10, 9, 30); 6 | // print(d); 7 | 8 | // UTC 9 | // var d = new DateTime.utc(2018, 10, 10, 9, 30); 10 | // print(d); 11 | 12 | // IOS 8601 13 | // var d1 = DateTime.parse('2018-10-10 09:30:30Z'); 14 | // print(d1); 15 | // var d2 = DateTime.parse('2018-10-10 09:30:30+0800'); 16 | // print(d2); 17 | 18 | // 时间 增减量 19 | // var d1 = DateTime.now(); 20 | // print(d1); 21 | // print(d1.add(new Duration(minutes: 5))); 22 | // print(d1.add(new Duration(minutes: -5))); 23 | 24 | // 比较时间 25 | // var d1 = new DateTime(2018, 10, 1); 26 | // var d2 = new DateTime(2018, 10, 10); 27 | // print(d1.isAfter(d2)); 28 | // print(d1.isBefore(d2)); 29 | // var d1 = DateTime.now(); 30 | // var d2 = d1.add(new Duration(milliseconds: 30)); 31 | // print(d1.isAtSameMomentAs(d2)); 32 | 33 | // 时间差 34 | // var d1 = new DateTime(2018, 10, 1); 35 | // var d2 = new DateTime(2018, 10, 10); 36 | // var difference = d1.difference(d2); 37 | // print([difference.inDays, difference.inHours]); 38 | 39 | // 时间戳 40 | // var now = new DateTime.now(); 41 | // print(now.millisecondsSinceEpoch); 42 | // print(now.microsecondsSinceEpoch); 43 | 44 | } -------------------------------------------------------------------------------- /10-列表/list.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 初始 3 | // var l = [1, 2, 3]; 4 | // print(l); 5 | 6 | 7 | // 声明 8 | 9 | // 自动 10 | // List l = new List(); 11 | // l 12 | // ..add(1) 13 | // ..add(2) 14 | // ..add(3); 15 | // print(l); 16 | 17 | // 定长 18 | // List l = new List(3); 19 | // // print(l[0]); 20 | // l[0] = 1; 21 | // l[1] = 2; 22 | // l[2] = 3; 23 | // print(l); 24 | 25 | 26 | // 属性 27 | // var l = [1, 2, 3]; 28 | // print(l.first); 29 | // print(l.last); 30 | // print(l.length); 31 | // print(l.isEmpty); 32 | // print(l.isNotEmpty); 33 | // print(l.reversed); 34 | 35 | 36 | // 方法 37 | // List l = new List(); 38 | 39 | // 添加 40 | // l 41 | // ..add(1) 42 | // ..addAll([2, 3, 4, 5]) 43 | // ..insert(0, 6) 44 | // ..insertAll(6, [6, 6]) 45 | // ; 46 | 47 | // 查询 48 | // print(l.indexOf(5)); 49 | // print(l.indexWhere((it) => it == 4)); 50 | 51 | // 删除 52 | // l.remove(6); 53 | // print(l); 54 | // l.removeAt(5); 55 | // print(l); 56 | 57 | // range 操作 58 | // l.fillRange(0, 3, 9); 59 | // print(l.getRange(0, 5)); 60 | 61 | // 洗牌 62 | // l.shuffle(); 63 | // print(l); 64 | // l.shuffle(); 65 | // print(l); 66 | 67 | // 排序 68 | // 数字 69 | // l.sort(); 70 | // print(l); 71 | // 日期 72 | // List dtList = new List(); 73 | // dtList.addAll([ 74 | // DateTime.now(), 75 | // DateTime.now().add(new Duration(days: -12)), 76 | // DateTime.now().add(new Duration(days: -2)) 77 | // ]); 78 | // print(dtList); 79 | // dtList.sort((a, b) => a.compareTo(b)); 80 | // print(dtList); 81 | 82 | 83 | // 复制子列表 84 | // print(l); 85 | // var l2 = l.sublist(1,4); 86 | // print(l2); 87 | 88 | // 操作符 89 | // var l1 = [1, 2, 3]; 90 | // var l2 = [4, 5, 6]; 91 | // print(l1 + l2); 92 | // l1[2] = 9; 93 | // print(l1[2]); 94 | 95 | } 96 | -------------------------------------------------------------------------------- /11-Map/map.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 初始 3 | // var a = {'name': 'ducafecat', 'web': 'www.ducafecat.tech'}; 4 | // print(a); 5 | 6 | // 声明 7 | // 松散 8 | // var a = new Map(); 9 | // a['name'] = 'ducafecat'; 10 | // a['web'] = 'www.ducafecat.tech'; 11 | // a[0] = 'abc'; 12 | // print(a); 13 | 14 | // 定义 k v 类型 15 | // var b = new Map(); 16 | // b[0] = 'java'; 17 | // b[1] = 'python'; 18 | // print(b); 19 | 20 | // print(a); 21 | 22 | // 基本属性 23 | // print(a.isEmpty); 24 | // print(a.isNotEmpty); 25 | // print(a.keys); 26 | // print(a.values); 27 | // print(a.length); 28 | // print(a.entries); 29 | 30 | // 常用方法 31 | // b.addAll(a); 32 | // b.addAll({'first': 'java', 'second': 'python'}); 33 | // b.addEntries(a.entries); 34 | // print(b); 35 | // b.clear(); 36 | // print(b); 37 | // print(a.containsKey('name')); 38 | // print(a.containsValue('www.ducafecat.tech')); 39 | // a.remove('name'); 40 | // a.removeWhere((key,val) => key == 'name'); 41 | // a.update('name', (val) => 'abc'); 42 | // a.updateAll((key, val) => "---$val---"); 43 | // print(a); 44 | 45 | // 操作符 46 | // print(a['name']); 47 | // a['name'] = 'abc'; 48 | // print(a); 49 | 50 | } 51 | -------------------------------------------------------------------------------- /12-Set/set.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // 声明 3 | // var a = new Set(); 4 | // a.add('java'); 5 | // a.add('php'); 6 | // a.add('python'); 7 | // a.add('java'); 8 | // a.add('sql'); 9 | // a.add('swift'); 10 | // a.add('dart'); 11 | // print('a => $a'); 12 | 13 | // 强类型 14 | // var b = new Set(); 15 | // b.addAll(['dart', 'c#', 'j#', 'e#']); 16 | 17 | // 属性 18 | // print(a.isEmpty); 19 | // print(a.isNotEmpty); 20 | // print(a.first); 21 | // print(a.last); 22 | // print(a.length); 23 | 24 | 25 | // 常用方法 26 | // b.addAll(['dart', 'c#', 'j#', 'e#']); 27 | // print(b.contains('dart')); 28 | // print(b.containsAll(['dart', 'swift'])); 29 | // print('b => $b'); 30 | // print(a.difference(b)); 31 | // print(a.intersection(b)); 32 | // print(b.lookup('dart')); 33 | // print(b.union(a)); 34 | // b.remove('dart'); 35 | // b.removeAll(['dart','c#']); 36 | // b.clear(); 37 | // print(b.firstWhere((it) => it == 'c#')); 38 | // print(b.lastWhere((it) => it == 'c#')); 39 | // b.removeWhere((it) => it == 'c#'); 40 | // b.retainAll(['e#']); 41 | // b.retainWhere((it) => it == 'e#'); 42 | // b.retainWhere((it) { 43 | // bool ret = it == 'e#'; 44 | // return ret; 45 | // }); 46 | // print('b => $b'); 47 | 48 | } -------------------------------------------------------------------------------- /13-Runes/runes.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // Dart 是 UTF-16 的字符串 3 | // Runes 对象 按 UTF-32 方式表示一个字符 4 | var a = '👺'; 5 | print(a.codeUnitAt(0));// 显示某个字符的 10进制 6 | print(a.length); // 字符数 7 | print(a.runes.length); // 字数 8 | print(a.codeUnits);// 字符 9 | print(a.runes);// 字 10 | 11 | // 转换字符表示 12 | Runes b = new Runes('\u{1f596} \u6211'); // UTF-16 编码大于4位 需要大括号 {...} 13 | 14 | // 转成字符串 15 | var c = String.fromCharCodes(b); 16 | print(c); 17 | // 打印 字符串长度 和 字符个数 18 | print(c.length); 19 | print(c.runes.length); 20 | } -------------------------------------------------------------------------------- /14-symbol-enum-comments/symbol-enum-comments.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:mirrors'; 2 | 3 | enum Status { none, running, stopped, paused } 4 | 5 | /// `main` 函数 6 | /// 7 | /// 符号 8 | /// 枚举 9 | /// 10 | void main() { 11 | /* 12 | * Symbol 13 | * 14 | Symbol libraryName = new Symbol('dart.core'); 15 | MirrorSystem mirrorSystem = currentMirrorSystem(); 16 | LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName); 17 | libMirror.declarations.forEach((s, d) => print('$s - $d')); 18 | */ 19 | 20 | // Enum 21 | // print(Status.values); 22 | // Status.values.forEach((it) => print('$it - index: ${it.index}')); 23 | } 24 | -------------------------------------------------------------------------------- /15-函数-function/function.dart: -------------------------------------------------------------------------------- 1 | void main(){ 2 | // var hr = add(x: 1); 3 | // print(hr); 4 | 5 | // 函数内定义 6 | // int add(int x){ 7 | // return x + x; 8 | // } 9 | // print(add(1)); 10 | 11 | // var add = makeAdd(1); 12 | // print(add(5)); 13 | } 14 | 15 | // 基础方式 16 | // int add(int x) { 17 | // return x + 1; 18 | // } 19 | 20 | // 可选参数 21 | // int add(int x, [int y, int z]) { 22 | // if (y == null) { 23 | // y = 1; 24 | // } 25 | // if (z == null) { 26 | // z = 1; 27 | // } 28 | // return x + y + z; 29 | // } 30 | 31 | // 可选参数 默认值 32 | // int add(int x, [int y = 1, int z = 2]) { 33 | // return x + y; 34 | // } 35 | 36 | // 命名参数 默认值 37 | // int add({int x = 1, int y = 1, int z = 1}) { 38 | // return x + y + z; 39 | // } 40 | 41 | // Funcation 返回函数对象 42 | // Function makeAdd(int x) { 43 | // return (int y) => x + y; 44 | // } 45 | -------------------------------------------------------------------------------- /16-操作符/operator.dart: -------------------------------------------------------------------------------- 1 | void main(){ 2 | // 优先级顺序 3 | // int x = 1; 4 | // int y = 2; 5 | // if(x == 1 && y == 2){ 6 | // print(x+y); 7 | // } 8 | 9 | // 算术操作符 10 | // print(5/2); 11 | // print(5~/2); 12 | // print(5 % 2); 13 | 14 | // 类型判定操作符 15 | // int a = 123; 16 | // String b = 'ducafecat'; 17 | // String c = 'abc'; 18 | // print(a as Object); 19 | // print(b is String); 20 | // print(c is! String); 21 | 22 | // 条件表达式 23 | // bool isFinish = true; 24 | // String txtVal = isFinish ? 'yes' : 'no'; 25 | // print(txtVal); 26 | // bool isFinish; 27 | // isFinish = isFinish ?? false; 28 | // print(isFinish); 29 | 30 | // 级联操作符 31 | // StringBuffer sb = new StringBuffer(); 32 | // sb 33 | // ..write('hello') 34 | // ..write('word') 35 | // ..write('\n') 36 | // ..writeln('doucafecat'); 37 | // print(sb); 38 | 39 | // ?. 操作符 40 | // String a; 41 | // print(a?.length); 42 | 43 | } -------------------------------------------------------------------------------- /17-流程控制语句/controlFlow.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // if else 3 | // bool isPrint = true; 4 | // if (isPrint) { 5 | // print('hello'); 6 | // } 7 | 8 | // for 9 | // for (var i = 0; i < 5; i++) { 10 | // print(i); 11 | // } 12 | 13 | // while 14 | // bool isDone = false; 15 | // while(!isDone) { 16 | // print('is not done'); 17 | // isDone = true; 18 | // } 19 | 20 | // do while 21 | // bool isRunning = true; 22 | // do { 23 | // print('is running'); 24 | // isRunning = false; 25 | // } while (isRunning); 26 | 27 | // switch case 28 | // String name = 'cat'; 29 | // switch (name) { 30 | // case 'cat': 31 | // print('cat'); 32 | // break; 33 | // default: 34 | // print('not find'); 35 | // } 36 | 37 | // break 38 | // num i = 1; 39 | // while(true) { 40 | // print('${i} - run'); 41 | // i++; 42 | // if(i == 5) { 43 | // break; 44 | // } 45 | // } 46 | 47 | // continue 48 | // for (var i = 0; i < 5; i++) { 49 | // if (i < 3) { 50 | // continue; 51 | // } 52 | // print(i); 53 | // } 54 | 55 | // continue 指定位置 56 | // String command = "close"; 57 | // switch(command) { 58 | // case "open": 59 | // print("open"); 60 | // break; 61 | // case "close": 62 | // print("close"); 63 | // continue doClose; 64 | 65 | // doClose: 66 | // case "doClose": 67 | // print("DO_CLOSE"); 68 | // break; 69 | 70 | // default: 71 | // print("-----"); 72 | // } 73 | } 74 | -------------------------------------------------------------------------------- /18-异常/exception.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | // throw new FormatException('这是一个格式错误提示'); 3 | 4 | 5 | 6 | // 抛出错误 7 | 8 | // Exception 对象 9 | // throw new FormatException('这是一个格式错误提示'); 10 | 11 | // Error 对象 12 | // throw new OutOfMemoryError(); 13 | 14 | // 任意对象 15 | // throw '这是一个异常'; 16 | 17 | 18 | // 捕获错误 19 | // try { 20 | // // throw new FormatException('这是一个格式错误提示'); 21 | // throw new OutOfMemoryError(); 22 | // } on OutOfMemoryError { 23 | // print('没有内存了'); 24 | // } catch (e) { 25 | // print(e); 26 | // } 27 | 28 | 29 | // 重新抛出错误 30 | // try { 31 | // throw new OutOfMemoryError(); 32 | // } on OutOfMemoryError { 33 | // print('没有内存了'); 34 | // rethrow; 35 | // } catch (e) { 36 | // print(e); 37 | // } 38 | 39 | 40 | // Finally执行 41 | // try { 42 | // throw new OutOfMemoryError(); 43 | // } on OutOfMemoryError { 44 | // print('没有内存了'); 45 | // rethrow; 46 | // } catch (e) { 47 | // print(e); 48 | // } finally { 49 | // print('end'); 50 | // } 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /19-类/abstract.dart: -------------------------------------------------------------------------------- 1 | // abstract 类、函数、成员 2 | abstract class Person { 3 | static const String name = 'ducafecat'; 4 | void printName(){ 5 | print(name); 6 | } 7 | } 8 | 9 | // 接口方式使用 10 | class Student implements Person { 11 | String name = 'this is student'; 12 | void printName() { 13 | print(name); 14 | } 15 | } 16 | 17 | // // 继承方式使用 18 | class Teacher extends Person { 19 | } 20 | 21 | void main() { 22 | var user1 = Student(); 23 | user1.printName(); 24 | 25 | var user2 = Teacher(); 26 | user2.printName(); 27 | } -------------------------------------------------------------------------------- /19-类/class.dart: -------------------------------------------------------------------------------- 1 | // 定义类 2 | // class Point { 3 | // } 4 | 5 | // 定义构造函数 6 | // class Point { 7 | // num x; 8 | // num y; 9 | // Point(num x, num y){ 10 | // this.x = x; 11 | // this.y = y; 12 | // } 13 | // } 14 | 15 | // 简化构造函数 16 | // class Point { 17 | // num x; 18 | // num y; 19 | // Point(this.x, this.y); 20 | // } 21 | 22 | // 初始化列表 23 | // class Point { 24 | // num x; 25 | // num y; 26 | // var origin; 27 | // Point(this.x, this.y): origin = {x:x, y:y}; 28 | // } 29 | 30 | // 命名构造函数 31 | // class Point { 32 | // num x; 33 | // num y; 34 | // Point.fromJson(Map json) { 35 | // x = json['x']; 36 | // y = json['y']; 37 | // } 38 | // } 39 | 40 | // 重定向构造函数 41 | // class Point { 42 | // num x; 43 | // num y; 44 | // Point(this.x, this.y); 45 | // Point.fromJson(Map json) : this(json['x'], json['y']); 46 | // } 47 | 48 | void main() { 49 | // 初始 50 | // var p = new Point(); 51 | // print(p); 52 | 53 | // 构造函数 54 | // var p = new Point(1, 2); 55 | // print([p.x, p.y]); 56 | 57 | // 初始化列表 58 | // var p = new Point(1, 2); 59 | // print([p.x, p.y, p.origin]); 60 | 61 | // 命名构造函数 62 | // var p = new Point.fromJson({"x": 1, "y": 2}); 63 | // print([p.x, p.y]); 64 | 65 | // 重定向构造函数 66 | // var p = new Point.fromJson({"x": 1, "y": 2}); 67 | // print([p.x, p.y]); 68 | } 69 | -------------------------------------------------------------------------------- /19-类/getset.dart: -------------------------------------------------------------------------------- 1 | // 定义 get set 2 | // class People { 3 | // String _name; 4 | 5 | // set pName(String value) { 6 | // _name = value; 7 | // } 8 | 9 | // String get pName { 10 | // return 'people is ${_name}'; 11 | // } 12 | // } 13 | 14 | // 简化 get set 15 | // class People { 16 | // String _name; 17 | 18 | // set pName(String value) => _name = value; 19 | 20 | // String get pName => 'people is ${_name}'; 21 | // } 22 | 23 | void main() { 24 | // var p = new People(); 25 | // p.pName = 'ducafecat'; 26 | // print(p.pName); 27 | } 28 | -------------------------------------------------------------------------------- /19-类/interface.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var p = AndroidPhone(); 3 | p.startup(); 4 | p.shutdown(); 5 | } 6 | 7 | class Phone { 8 | void startup() { 9 | print('开机'); 10 | } 11 | void shutdown() { 12 | print('关机'); 13 | } 14 | } 15 | 16 | class Mobile { 17 | int signal; 18 | } 19 | 20 | class AndroidPhone implements Phone, Mobile { 21 | int signal; 22 | void startup() { 23 | print('AndroidPhone 开机'); 24 | } 25 | void shutdown() { 26 | print('AndroidPhone 关机'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /19-类/static.dart: -------------------------------------------------------------------------------- 1 | // 静态变量 2 | // class People { 3 | // static String name = 'ducafecat'; 4 | // } 5 | 6 | // 函数内部访问 7 | // class People { 8 | // static String name = 'ducafecat'; 9 | // void show() { 10 | // print(this.name); // 不能用this 11 | // print(name); 12 | // } 13 | // } 14 | 15 | // 静态方法 16 | // class People { 17 | // static String name = 'ducafecat'; 18 | // static void printName() { 19 | // print(name); 20 | // } 21 | // } 22 | 23 | void main() { 24 | 25 | // 静态变量可以通过外部直接访问,不需要将类实例化 26 | // print(People.name); 27 | 28 | // var p = new People(); 29 | // p.show(); 30 | 31 | // 静态方法 32 | // People.printName(); 33 | } 34 | -------------------------------------------------------------------------------- /24-继承/1-实现继承.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var p = AndroidPhone(); 3 | p.startup(); 4 | p.shutdown(); 5 | } 6 | 7 | class Phone { 8 | void startup() { 9 | print('开机'); 10 | } 11 | void shutdown() { 12 | print('关机'); 13 | } 14 | } 15 | 16 | class AndroidPhone extends Phone { 17 | } -------------------------------------------------------------------------------- /24-继承/2-继承抽象类的问题.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var p = AndroidPhone(); 3 | p.startup(); 4 | p.shutdown(); 5 | } 6 | 7 | abstract class Phone { 8 | void startup(); 9 | void shutdown(); 10 | } 11 | 12 | class AndroidPhone extends Phone { 13 | void startup() { 14 | print('开机'); 15 | } 16 | void shutdown() { 17 | print('关机'); 18 | } 19 | } -------------------------------------------------------------------------------- /24-继承/3-父类调用.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var p = AndroidPhone(); 3 | p.startup(); 4 | } 5 | 6 | class Phone { 7 | void startup() { 8 | print('开机'); 9 | } 10 | void shutdown() { 11 | print('关机'); 12 | } 13 | } 14 | 15 | class AndroidPhone extends Phone { 16 | void startup() { 17 | super.startup(); 18 | print('AndroidPhone 开机'); 19 | } 20 | } -------------------------------------------------------------------------------- /24-继承/4-调用父类构造.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var p = AndroidPhone(12345678); 3 | p.showNumber(); 4 | } 5 | 6 | class Mobile { 7 | int number; 8 | int signal; 9 | Mobile(this.number); 10 | void showNumber() { 11 | print('010-${number}'); 12 | } 13 | } 14 | 15 | class AndroidPhone extends Mobile { 16 | AndroidPhone(int number) : super(number); 17 | } -------------------------------------------------------------------------------- /24-继承/5-重写超类函数.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | dynamic p = AndroidPhone(12345678); 3 | p.showNumber111(); 4 | } 5 | 6 | class Mobile { 7 | int number; 8 | int signal; 9 | Mobile(this.number); 10 | void showNumber() { 11 | print('010-${number}'); 12 | } 13 | } 14 | 15 | class AndroidPhone extends Mobile { 16 | AndroidPhone(int number) : super(number); 17 | 18 | @override 19 | void noSuchMethod(Invocation mirror) { 20 | print('被重写 noSuchMethod'); 21 | } 22 | } -------------------------------------------------------------------------------- /25-多类继承/函数冲突.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var xm = Xiaomi(); 3 | xm.startup(); 4 | xm.shutdown(); 5 | xm.sms(); 6 | } 7 | 8 | class Phone { 9 | void startup() { 10 | print('开机'); 11 | } 12 | void shutdown() { 13 | print('关机'); 14 | } 15 | } 16 | 17 | class AndroidPhone extends Phone { 18 | void startup() { 19 | super.startup(); 20 | print('AndroidPhone 开机'); 21 | } 22 | } 23 | 24 | class AndroidSystem { 25 | void call() { 26 | print('android call'); 27 | } 28 | } 29 | 30 | class Weixin { 31 | void sms() { 32 | print('weixin sms'); 33 | } 34 | } 35 | 36 | class QQ { 37 | void sms() { 38 | print('qq sms'); 39 | } 40 | } 41 | 42 | class Xiaomi extends AndroidPhone with AndroidSystem, Weixin, QQ { 43 | void startup() { 44 | super.startup(); 45 | print('AndroidPhone 开机'); 46 | } 47 | } -------------------------------------------------------------------------------- /25-多类继承/多继承类.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var xm = Xiaomi(); 3 | xm.startup(); 4 | xm.shutdown(); 5 | xm.call(); 6 | xm.sms(); 7 | } 8 | 9 | class Phone { 10 | void startup() { 11 | print('开机'); 12 | } 13 | void shutdown() { 14 | print('关机'); 15 | } 16 | } 17 | 18 | class AndroidPhone extends Phone { 19 | void startup() { 20 | super.startup(); 21 | print('AndroidPhone 开机'); 22 | } 23 | } 24 | 25 | class AndroidSystem { 26 | void call() { 27 | print('android call'); 28 | } 29 | } 30 | 31 | class Weixin { 32 | void sms() { 33 | print('weixin sms'); 34 | } 35 | } 36 | 37 | class Xiaomi extends AndroidPhone with AndroidSystem, Weixin { 38 | void startup() { 39 | super.startup(); 40 | print('AndroidPhone 开机'); 41 | } 42 | } -------------------------------------------------------------------------------- /26-工厂模式/工厂函数.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var xm = phoneFactory('ios'); 3 | xm.startup(); 4 | xm.shutdown(); 5 | } 6 | 7 | class Phone { 8 | void startup() { 9 | print('开机'); 10 | } 11 | void shutdown() { 12 | print('关机'); 13 | } 14 | } 15 | 16 | Phone phoneFactory(String name) { 17 | switch (name) { 18 | case 'android': 19 | return new AndroidPhone(); 20 | break; 21 | default: 22 | return new IOSPhone(); 23 | } 24 | } 25 | 26 | class AndroidPhone extends Phone { 27 | void startup() { 28 | super.startup(); 29 | print('Android Phone 开机'); 30 | } 31 | } 32 | 33 | class IOSPhone extends Phone { 34 | void startup() { 35 | super.startup(); 36 | print('IOS Phone 开机'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /26-工厂模式/工厂构造函数.dart: -------------------------------------------------------------------------------- 1 | void main() { 2 | var xm = Phone('android'); 3 | xm.startup(); 4 | xm.shutdown(); 5 | } 6 | 7 | abstract class Phone { 8 | factory Phone(String name) { 9 | switch (name) { 10 | case 'android': 11 | return new AndroidPhone(); 12 | break; 13 | default: 14 | return new IOSPhone(); 15 | } 16 | } 17 | void startup(); 18 | void shutdown(); 19 | } 20 | 21 | class AndroidPhone implements Phone { 22 | void startup() { 23 | print('Android Phone 开机'); 24 | } 25 | void shutdown() { 26 | print('Android 关机'); 27 | } 28 | } 29 | 30 | class IOSPhone implements Phone { 31 | void startup() { 32 | print('IOS Phone 开机'); 33 | } 34 | void shutdown() { 35 | print('IOS 关机'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /27-库/phone.dart: -------------------------------------------------------------------------------- 1 | abstract class Phone { 2 | factory Phone(String name) { 3 | switch (name) { 4 | case 'android': 5 | return new AndroidPhone(); 6 | break; 7 | default: 8 | return new IOSPhone(); 9 | } 10 | } 11 | void startup(); 12 | void shutdown(); 13 | } 14 | 15 | class AndroidPhone implements Phone { 16 | void startup() { 17 | print('Android Phone 开机'); 18 | } 19 | void shutdown() { 20 | print('Android 关机'); 21 | } 22 | } 23 | 24 | class IOSPhone implements Phone { 25 | void startup() { 26 | print('IOS Phone 开机'); 27 | } 28 | void shutdown() { 29 | print('IOS 关机'); 30 | } 31 | } -------------------------------------------------------------------------------- /27-库/phone1.dart: -------------------------------------------------------------------------------- 1 | abstract class Phone { 2 | factory Phone(String name) { 3 | switch (name) { 4 | case 'android': 5 | return new AndroidPhone(); 6 | break; 7 | default: 8 | return new IOSPhone(); 9 | } 10 | } 11 | void startup(); 12 | void shutdown(); 13 | } 14 | 15 | class AndroidPhone implements Phone { 16 | void startup() { 17 | print('Android 1 Phone 开机'); 18 | } 19 | void shutdown() { 20 | print('Android 1 关机'); 21 | } 22 | } 23 | 24 | class IOSPhone implements Phone { 25 | void startup() { 26 | print('IOS 1 Phone 开机'); 27 | } 28 | void shutdown() { 29 | print('IOS 1 关机'); 30 | } 31 | } -------------------------------------------------------------------------------- /27-库/前缀.dart: -------------------------------------------------------------------------------- 1 | import './phone.dart'; 2 | import './phone1.dart' as pp; 3 | 4 | void main() { 5 | var xm = Phone('android'); 6 | xm.startup(); 7 | xm.shutdown(); 8 | 9 | var xm1 = pp.Phone('android'); 10 | xm1.startup(); 11 | xm1.shutdown(); 12 | } -------------------------------------------------------------------------------- /27-库/导入文件.dart: -------------------------------------------------------------------------------- 1 | import './phone.dart'; 2 | 3 | void main() { 4 | var xm = Phone('android'); 5 | xm.startup(); 6 | xm.shutdown(); 7 | } -------------------------------------------------------------------------------- /27-库/延迟.dart: -------------------------------------------------------------------------------- 1 | import './phone.dart' deferred as pp; 2 | 3 | void main() async { 4 | var run = true; 5 | if (run) { 6 | await pp.loadLibrary(); 7 | var xm = pp.Phone('android'); 8 | xm.startup(); 9 | xm.shutdown(); 10 | } 11 | } -------------------------------------------------------------------------------- /27-库/核心库.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | void main() { 4 | var f = new File('README.md'); 5 | var content = f.readAsStringSync(); 6 | print(content); 7 | } -------------------------------------------------------------------------------- /27-库/第三方库.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | void main() async { 4 | Dio dio = new Dio(); 5 | Response response = await dio.get("https://www.baidu.com"); 6 | print(response.data); 7 | } -------------------------------------------------------------------------------- /27-库/筛选.dart: -------------------------------------------------------------------------------- 1 | // import './phone.dart' hide AndroidPhone; 2 | import './phone.dart' show IOSPhone; 3 | 4 | void main() { 5 | var xm = IOSPhone(); 6 | xm.startup(); 7 | xm.shutdown(); 8 | } -------------------------------------------------------------------------------- /28-泛型/构造函数泛型.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var p = Phone('abc00000011111'); 3 | print(p.mobileNumber); 4 | } 5 | 6 | class Phone { 7 | final T mobileNumber; 8 | Phone(this.mobileNumber); 9 | } -------------------------------------------------------------------------------- /28-泛型/泛型使用.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var l = List(); 3 | l.add('aaa'); 4 | l.add('bbb'); 5 | l.add('ccc'); 6 | print(l); 7 | 8 | var m = Map(); 9 | m[1] = 'aaaa'; 10 | m[2] = 'bbbb'; 11 | m[3] = 'cccc'; 12 | print(m); 13 | } -------------------------------------------------------------------------------- /28-泛型/泛型函数.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var key = addCache('a00001', 'val.....'); 3 | print(key); 4 | } 5 | 6 | K addCache(K key, V val) { 7 | print('${key} ${val}'); 8 | return key; 9 | } -------------------------------------------------------------------------------- /28-泛型/泛型限制.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var ad = AndroidPhone(); 3 | var p = Phone(ad); 4 | p.mobile.startup(); 5 | } 6 | 7 | class Phone { 8 | final T mobile; 9 | Phone(this.mobile); 10 | } 11 | 12 | class AndroidPhone { 13 | void startup() { 14 | print('Android Phone 开机'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /29-异步/异步调用-回调.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | void main() { 4 | Dio dio = new Dio(); 5 | dio.get("https://www.baidu.com").then((response) { 6 | print(response.data); 7 | }); 8 | } -------------------------------------------------------------------------------- /29-异步/异步调用-等待.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | void main() async { 4 | Dio dio = new Dio(); 5 | Response response = await dio.get("https://www.baidu.com"); 6 | print(response.data); 7 | } -------------------------------------------------------------------------------- /29-异步/异步返回值.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | void main() async { 4 | var content = await getUrl('https://www.baidu.com'); 5 | print(content); 6 | } 7 | 8 | Future getUrl(String url) async { 9 | Dio dio = new Dio(); 10 | Response response = await dio.get(url); 11 | return response.data; 12 | } 13 | -------------------------------------------------------------------------------- /30-生成器/同步生成器.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var it = naturalsTo(5).iterator; 3 | while(it.moveNext()) { 4 | print(it.current); 5 | } 6 | } 7 | 8 | Iterable naturalsTo(int n) sync* { 9 | print('start'); 10 | int k = 0; 11 | while (k < n) { 12 | yield k++; 13 | } 14 | print('end'); 15 | } 16 | -------------------------------------------------------------------------------- /30-生成器/异步生成器.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | main(List args) { 4 | // 流监听 5 | // asynchronousNaturalsTo(5).listen((onData) { 6 | // print(onData); 7 | // }); 8 | 9 | // 流监听 StreamSubscription 对象 10 | StreamSubscription subscription = asynchronousNaturalsTo(5).listen(null); 11 | subscription.onData((value) { 12 | print(value); 13 | // subscription.pause(); 14 | }); 15 | } 16 | 17 | Stream asynchronousNaturalsTo(int n) async* { 18 | print('start'); 19 | int k = 0; 20 | while (k < n) { 21 | yield k++; 22 | } 23 | print('end'); 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /30-生成器/递归生成器.dart: -------------------------------------------------------------------------------- 1 | 2 | main(List args) { 3 | var it = naturalsDownFrom(5).iterator; 4 | while(it.moveNext()) { 5 | print(it.current); 6 | } 7 | } 8 | 9 | Iterable naturalsDownFrom(int n) sync* { 10 | if ( n > 0) { 11 | yield n; 12 | yield* naturalsDownFrom(n-1); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /31-可调用类/callable.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var phone = IOSPhone(); 3 | phone('911'); 4 | 5 | // IOSPhone()('911'); 6 | } 7 | 8 | class IOSPhone { 9 | call(String num) { 10 | print('phone number is $num'); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /32-隔离/isolates.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:isolate'; 3 | 4 | main() async { 5 | var receivePort = new ReceivePort(); 6 | await Isolate.spawn(echo, receivePort.sendPort); 7 | 8 | // first 是 echo 线程的消息入口 9 | var sendPort = await receivePort.first; 10 | 11 | var msg = await sendReceive(sendPort, "foo"); 12 | print('received $msg'); 13 | msg = await sendReceive(sendPort, "bar"); 14 | print('received $msg'); 15 | } 16 | 17 | // 隔离的入口点 18 | echo(SendPort sendPort) async { 19 | // 打开接收端口接收传入的消息。 20 | var port = new ReceivePort(); 21 | 22 | // 通知任何其他隔离此隔离侦听的端 23 | sendPort.send(port.sendPort); 24 | 25 | // 循环接收消息 26 | await for (var msg in port) { 27 | var data = msg[0]; 28 | SendPort replyTo = msg[1]; 29 | replyTo.send(data); 30 | if (data == "bar") port.close(); 31 | } 32 | } 33 | 34 | // 发送并接收消息 35 | Future sendReceive(SendPort port, msg) { 36 | ReceivePort response = new ReceivePort(); 37 | port.send([msg, response.sendPort]); 38 | return response.first; 39 | } 40 | -------------------------------------------------------------------------------- /33-类型信息/nouse.dart: -------------------------------------------------------------------------------- 1 | class SortedCollection { 2 | Function compare; 3 | 4 | SortedCollection(int f(Object a, Object b)) { 5 | compare = f; 6 | } 7 | } 8 | 9 | // Initial, broken implementation. 10 | int sort(Object a, Object b) => 0; 11 | 12 | main() { 13 | SortedCollection coll = new SortedCollection(sort); 14 | 15 | // 我们只知道 compare 是一个 Function 类型, 16 | // 但是不知道具体是何种 Function 类型? 17 | assert(coll.compare is Function); 18 | } 19 | -------------------------------------------------------------------------------- /33-类型信息/typedef.dart: -------------------------------------------------------------------------------- 1 | typedef int Compare(Object a, Object b); 2 | 3 | class SortedCollection { 4 | Compare compare; 5 | 6 | SortedCollection(this.compare); 7 | } 8 | 9 | int sort(Object a, Object b) => 0; 10 | 11 | main() { 12 | SortedCollection coll = new SortedCollection(sort); 13 | assert(coll.compare is Function); 14 | assert(coll.compare is Compare); 15 | } 16 | -------------------------------------------------------------------------------- /34-媒体信息/deprecated.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | var t = new Television(); 3 | t.activate(); 4 | t.turnOn(); 5 | } 6 | 7 | class Television { 8 | 9 | @deprecated 10 | void activate() { 11 | turnOn(); 12 | } 13 | 14 | void turnOn() { 15 | print('on!'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /34-媒体信息/override.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | dynamic a = new A(); 3 | a.message(); 4 | } 5 | 6 | class A { 7 | @override 8 | noSuchMethod(Invocation mirror) { 9 | print('没有找到方法'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /34-媒体信息/proxy.dart: -------------------------------------------------------------------------------- 1 | main(List args) { 2 | dynamic a = new A(); 3 | a.say(); 4 | } 5 | 6 | @proxy 7 | class A { 8 | noSuchMethod(Invocation mirror) { 9 | print('没有找到方法'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /34-媒体信息/todo.dart: -------------------------------------------------------------------------------- 1 | import 'dart:mirrors'; 2 | 3 | main(List args) { 4 | currentMirrorSystem().libraries.forEach((uri, lib) { 5 | // print('lib: ${uri}'); 6 | lib.declarations.forEach((s, decl) { 7 | // print('decl: ${s}'); 8 | decl.metadata.where((m) => m.reflectee is Todo).forEach((m) { 9 | var anno = m.reflectee as Todo; 10 | if (decl is MethodMirror) { 11 | print('Todo(${anno.who}, ${anno.what})'); 12 | ((decl as MethodMirror).owner as LibraryMirror).invoke(s, []); 13 | } 14 | ; 15 | }); 16 | }); 17 | }); 18 | } 19 | 20 | @Todo('seth', 'make this do something') 21 | void doSomething() { 22 | print('do something'); 23 | } 24 | 25 | class Todo { 26 | final String who; 27 | final String what; 28 | 29 | const Todo(this.who, this.what); 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dart语言学习 【配套代码】 2 | 3 | ## 技术文档 4 | 5 | https://ducafecat.tech/categories/Dart语言学习/ 6 | 7 | ## 视频 8 | 9 | https://www.youtube.com/channel/UCPQU3bNzZYamT09aqzUnrXQ 10 | 11 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile 3 | packages: 4 | cookie_jar: 5 | dependency: transitive 6 | description: 7 | name: cookie_jar 8 | url: "https://pub.flutter-io.cn" 9 | source: hosted 10 | version: "0.0.7" 11 | dio: 12 | dependency: "direct main" 13 | description: 14 | name: dio 15 | url: "https://pub.flutter-io.cn" 16 | source: hosted 17 | version: "1.0.9" 18 | sdks: 19 | dart: ">=2.0.0-dev.58.0 <3.0.0" 20 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: ducafecat 2 | dependencies: 3 | dio: 1.0.9 --------------------------------------------------------------------------------