Dart入门—库、泛型与异常

释放双眼,带上耳机,听听看~!

Dart入门—库、泛型与异常

Pub仓库

在Pub上可以下载到支持各种功能的包,首页在根目录下建立pubspec.yaml文件


1
2
3
4
1name: test_app
2dependencies:
3  sqljocky: ^0.14.1
4

name是包的名称,dependencies是需要依赖的包名,上面的sqljocky是用来连接MySQL的。执行pub get命令下载相关依赖包
执行完毕后,在根目录下会产生多个文件
更多细节请查看Pub仓库

使用库

使用dart核心库


1
2
3
4
5
6
1import "dart:math";
2
3void main() {
4    print(PI);
5}
6

导入Pub上的库


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1import 'package:sqljocky/sqljocky.dart';
2
3void main() {
4    // 创建一个连接池
5    var pool = new ConnectionPool(host:'localhost', port:3306, user:'bob', password:'wibble', db:'userdb', max:5);
6    // 执行一个查询
7    var results = pool.query('SELECT user_id,telphone FROM t_user WHERE telphone="13823128549" OR user_id="699"');
8    // 遍历查询结果(forEach是异步操作)
9    results.then((results){
10        results.forEach((row){
11            print('UserId:${row[0]}, Telphone:${row[1]}');
12            print('UserId:${row.user_id}, Telphone:${row.telphone}');
13        });
14    });
15}
16

如果两个库有冲突的标识符,可以为其中一个或两个库都指定前缀


1
2
3
4
5
6
1import 'package:lib1/lib1.dart';
2import 'package:lib2/lib2.dart' as lib2;
3// ...
4var element1 = new Element();
5var element2 = new lib2.Element();
6

如果只需要使用库的一部分,可以选择性的导入


1
2
3
4
5
6
1//只导入foo
2import 'package:lib1/lib1.dart' show foo;
3
4//导入除了foo以外的所有
5import 'package:lib2/lib2.dart' hide foo;
6

让程序延迟加载一个库时,延迟加载库,您必须使用deferred as,await 关键字暂停执行直到加载库,您可以多次使用loadLibrary(),库只加载一次


1
2
3
4
5
6
7
8
1import 'package:deferred/hello.dart' deferred as hello;
2
3// 当你需要使用库,使用 loadLibrary() 调用库
4greet() async {
5  await hello.loadLibrary();
6  hello.printGreeting();
7}
8

自定义库

首先创建mystorage.dart文件,声明mystorage库和需要的util.dart与tool.dart文件


1
2
3
4
5
6
7
8
9
1library mystorage;
2
3import "dart:math";
4
5part "util.dart";
6part "tool.dart";
7
8void printPi() => print(PI);
9

创建util.dart文件供mystorage库使用


1
2
3
4
1part of mystorage;
2
3void printUtil() => print("Hello util.dart!");
4

创建tool.dart文件供mystorage库使用


1
2
3
4
1part of mystorage;
2
3void printTool() => print("Hello tool.dart!");
4

最后在主方法中调用mystorage库


1
2
3
4
5
6
7
8
1import "mystorage.dart";
2
3void main(){
4    printUtil();
5    printTool();
6    printPi();
7}
8

泛型

dart中所有基本类型数组和列表都是泛型,这样可以提高代码的可读性


1
2
3
4
5
6
7
1void main(){
2    var names = new List<String>();
3    names.addAll(['Seth', 'Kathy', 'Lars']);
4    // 检查模式编译失败,生产模式编译成功
5    names.add(42);
6}
7

泛型可以减少代码重复,也可以创建多类型共享的接口,同时还能在检查模式早期预警,比如创建一个接口缓存对象


1
2
3
4
5
1abstract class ObjectCache {
2    Object getByKey(String key);
3    setByKey(String key, Object value);
4}
5

如果还要创建String的接口、number的接口就会很麻烦,使用泛型可以节省创建这些接口的麻烦


1
2
3
4
5
1abstract class Cache<T> {
2  T getByKey(String key);
3  setByKey(String key, T value);
4}
5

dart的泛型需要具体化,这意味着泛型在运行时携带着类型信息


1
2
3
4
1var names = new List<String>();
2names.addAll(['Seth', 'Kathy', 'Lars']);
3print(names is List<String>);
4

异常

dart会抛出并捕获异常,如果没有捕获异常,就会中断运行或结束程序,与Java不同的是dart的所有异常都是未经检查的,dart提供了Exception、Error类型,以及更多的子类型,也可以自定义异常

Throw


1
2
3
4
5
6
7
8
9
1    // 抛出一个异常
2    throw new FormatException('Expected at least 1 section');
3
4    // 抛出任意异常对象
5    throw 'Out of llamas!';
6
7    // 用=> statements在任何地方抛出任意异常
8    distanceTo(Point other) => throw new UnimplementedError();
9

Catch

捕获异常并处理


1
2
3
4
5
6
1    try {
2        breedMoreLlamas();
3    } on OutOfLlamasException {
4        buyMoreLlamas();
5    }
6

多个类型可以指定多个异常处理,可以使用on和catch或两者都用,使用on指定异常类型,使用catch给异常处理程序一个异常对象


1
2
3
4
5
6
7
8
9
10
11
12
13
1    try {
2      breedMoreLlamas();
3    } on OutOfLlamasException {
4      //指定的异常
5      buyMoreLlamas();
6    } on Exception catch (e) {
7      //所有异常
8      print('Unknown exception: $e');
9    } catch (e) {
10      //没有指定类型,处理所有异常
11      print('Something really unknown: $e');
12    }
13

Finally

确保代码的运行,不管是否抛出异常,使用finally子句,无论是否有匹配异常的catch子句,最终都执行finally子句


1
2
3
4
5
6
7
1    try {
2      breedMoreLlamas();
3    } finally {
4      //总是执行,即使抛出异常
5      cleanLiamaStalls();
6    }
7

匹配任何异常catch子句后运行finally子句


1
2
3
4
5
6
7
8
9
10
1    try {
2      breedMoreLlamas();
3    } catch(e) {
4      //首先处理异常
5      print('Error: $e');
6    } finally {
7      //然后执行
8      cleanLiamaStalls();
9    }
10

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++中引用和指针的区别

2022-1-11 12:36:11

安全经验

微软通知 Chrome 和 Firefox 用户 Edge 更安全

2016-11-20 11:12:22

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索