前言
上一篇介绍了Dart语言基础语法及一些简单概念,这一篇继续学习一些关于Dart语言的进阶概念,以便后续写代码时遇到问题,知道查什么。
注意:这里假设你已经有使用其它语言进行编程的经验,如果什么经验都没有,那读起来可能像是在读天书。
常用核心库
Dart 拥有非常丰富的核心库用以为诸如处理对象集合(dart:collection)、进行数学运算(dart:math)以及编/解码数据(dart:convert)等常用编程操作提供支持。
下面几个库建议着重看下:
- dart:async:支持通过使用 Future 和 Stream 这样的类实现异步编程。
- dart:convert:用于提供转换不同数据的编码器和解码器,包括 JSON 和 UTF-8。
- dart:core:每一个 Dart 程序都可能会使用到的内置类型、集合以及其它的一些核心功能。
- dart:math:包含算术相关函数和常量,还有随机数生成器。
packages
packages就是用来共享的软件包,类似于Java中引入jar包。
pubspec.yaml
要使用packages,只需要在pubspec.yaml引入对应的依赖即可,示例如下:
name: time_hunters
description: A new Flutter project.
version: 1.0.0 1
environment:
sdk: ">=2.17.1 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
get packages
// 获取依赖命令
dart pub get
使用packages
import 'package:js/js.dart' as js;
import 'package:intl/intl.dart';
Mixins
Mixin 是一种在多个类层次结构中重用代码的方法。示例如下:
mixin Piloted {
int astronauts = 1;
void describeCrew() {
print('Number of astronauts: $astronauts');
}
}
// 现在只需使用 Mixin 的方式继承这个类就可将该类中的功能添加给其它类。
class PilotedCraft extends Spacecraft with Piloted {
// ···
}
空安全
Dart 语言已支持健全的空安全机制!
当你选择使用空安全时,代码中的类型将默认是非空的,意味着 除非你声明它们可空,它们的值都不能为空。有了空安全,原本处于你的 运行时 的空值引用错误将变为 编辑时 的分析错误。
有了空安全,下面代码中所有的变量都是非空的:
// In null-safe Dart, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();
若你想让变量可以为 null,只需要在类型声明后加上 ?。
int? aNullableInt = null;
空安全核心原则:默认不可空、渐进迁移、完全可靠。
异步&并发
Dart 通过 async-await、isolate 以及一些异步类型概念(例如 Future 和 Stream)支持了并发代码编程。
在应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制。
大部分 Dart 应用只会使用一个 isolate(即主isolate),同时你也可以创建更多的 isolate,从而在多个处理器内核上达成并行执行代码的目的。
async和await
使用 async 和 await 关键字可以让你避免回调地狱(Callback Hell)并使你的代码更具可读性。
const oneSecond = Duration(seconds: 1);
// ···
Future<void> printWithDelay(String message) async {
await Future.delayed(oneSecond);
print(message);
}
// 上面的方法相当于:
Future<void> printWithDelay(String message) {
return Future.delayed(oneSecond).then((_) {
print(message);
});
}
关于Isolate 的工作原理,建议认真看下官方文档,比各种解析写的好多了:dart.cn/guides/lang…
使用Json
许多移动或网页应用都使用 JSON 来处理类似与服务器交换数据的任务。
推荐使用以下几个库:
- dart:convert:包含 JSON 数据和 UTF-8(JSON 数据需要的字符编码)的转换器。
- package:json_serializable:一个易于使用的代码生成包。当你添加一些元注解以及使用该包提供的构建器时, Dart 编译器可以为你生成序列化和反序列化的代码。
- package:built_value:一个强大的,可以作为 json_serializable 替代的 package。
测试&调优
推荐以下几个库:
- package:test:提供在 Dart 中编写测试的标准方法。
- package:mockito:提供一种创建模拟对象的方法,可轻松配置为在固定场景中使用,并验证被测系统是否以预期方式与模拟对象交互。
- Testing Flutter Apps:如何在 Flutter 应用程序上执行单元、小部件或集成测试。
- flutter_test:建立在 package:test 之上的 Flutter 测试库。
- flutter_driver:一个测试库,用于在真实设备和模拟器上测试 Flutter 应用程序(在一个单独的进程中)。
- flutter_gallery:Flutter 库示例的源代码和测试。
- flutter/dev/manual_tests:Flutter SDK 中的许多测试示例。
本文出至:学新通技术网
系列文章:Flutter从0到1开发APP
标签: