文章目录
- 前言
- 一、Dart 概述
- Dart 重要的概念
- 二、变量与基本数据类型
- 三、函数
- 四、运算符
- 五、流程控制语句
- 六、异常处理
- 七、面向对象
- 构造函数
- 继承类
- 抽象类
- 枚举类型
- 八、泛型
- 九、库的使用
- 引用库
- 指定库前缀
- 引用库的一部分
- 总结技巧
- 1. 安全调用
- 2. 设置默认值
- 3. 简化判断
前言
Dart
作为 Flutter SDK
指定的语言,我们很有必要补充一下 Dart 语言的基础知识,包括它的语法特性、基本语句
面向对象等知识点。
- Dart 重要概念与常用开发库
- 变量与基本数据类型
- 函数
- 运算符
- 流程控制语句
- 异常处理
- 面向对象
- 泛型
- 库的使用
- 异步支持
- 元数据
- 注释
一、Dart 概述
Dart
诞生于 2011年10月10 日, 谷歌 Dart 语言项目的领导人 Lars Bak 在丹麦举行的 Goto 会议上发布, Dart 是一种 结构化的 Web编程
语言,Dart
编程语言在所有现代浏览器和环境中提供高性能。Dart 虽然是谷歌开发的计算机编程语 ,但后来被 ECMA 认定为标准。这门语言用于Web 、服务器、移动应用和物联网等领域的开发,是宽松开源许可证书(修改的 BSD 书)下的开源软件。
那么 Flutter
和 Dart
有什么关系?确实有关系。早期 Flutter 团队评估了十多种语言才选择了 Dart ,因为它符合构建用户界面的方式。 以下 Flutter 团队看重 Dart 语言的部分特性:
- Dart 是 AOT (Ahead Of Time )编译的,编译成快速、可预测的本地代码 ,使 Flutter几乎都可以使用 Dart 编写。这不仅使 Flutter 变得更快,而且几乎所有的组件(包括所有的小部件)都可以定制。
- Dart 也可以 JIT ( Just In Time )编译,开发周期异常快,工作流颠覆常规(包括 Flutter 流行的亚秒级有状态热重载)。
- Dart 可以更轻松地创建以
60fps
运行的流畅动画和转场。 Dart 可以在没有锁的情况下进行对象分配和垃圾回收,就像 JavaScript 一样, Dart 避免了抢占式调度和共享内存(因而也不需要锁)。由于 Flutter 应用程序被编译为本地代码,因此不需要在领域之间建立缓慢的桥梁(例如, JavaScript 到本地代码)。 它的启动速度也快得多。 - Dart 使 Flutter 不需要单独的声明式布局语言(如 JSX或XML ),或单独的可视化界面构建器,因为 Dart 的声明式编程布局易于阅读和可视化。所有的布局使用一种语言,聚集在一处, Flutter 很容易提供高级工具,使布局更简单。
- 开发人员发现 Dart 特别容易学习,因为它具有静态和动态语言用户都熟悉的特性。并非所有这些功能都是Dart 独有的,但 Dart 将这些功能组合得恰到好处,使 Dart 实现 Flutter 方面独一无二。 因此,没有 Dart ,很难想象 Flutter 像现在这样强大。
Dart 重要的概念
- 一切皆对象。
- Dart代码在运行前解析
- 统一程序入口:main()
- Dart支持 async/await 异步处理
- 关键字:abstract ,do, import, super, as, dynamic, in , switch, assert,else, interface, sync*, enum, implements, is, this, async*, export, library, throw, await, external, mixin, true, break ,extends, new, try, case, factory, null, typedef, catch , false, operator, var, class, final, part, void, const, finally, rethrow, while, continue, for, return, with, covariant, get, set, yield*, default, if,
static, deferred。
其中如下 个开发库的使用频率最高
dart:core
:核心库,包括 strings、 numbers、 collections、 errors、 dates、 URIs等。dart:html
:网页开发里 DOM 相关的一些库。dart:io
: I/O命令行使用的I/O库。
dart:core
库是 Dart 初始已经包含的库,其他的任何库在使用前都需 加上import
语句,例如使用dart:html
可以使用如下的命令:import 'dart:html';
使用官方提供的 pub 工具可以安装丰富的第三方库。第三方库的地址为 https://pub.dev/
二、变量与基本数据类型
Dart 基本数据类型:Number(int、double)、String、Boolean、List、Map。
// var 生命变量
var name = "张三";
// 常量 final 只能设置一次
final username = "zhangsan";
// 常量 const
const pi = 3.1415926;
// 字符串
var s = "string";
// 布尔
var boolean = true;
// List
var list = [1,2,3];
// Map
var map = {
'男': 1,
'女': 2
}
三、函数
bool equal(String str1, String str2) {
return str1 == str2
}
可选参数用[ ]
,如 getInfo(String name, String sex, [String from])
参数默认值,如 getInfo(String name, String sex, [String from = ‘中国’])
函数返回值:
- 所有函数都会有返回值
- 如果没有指定默认返回null
- 没有返回值的函数,系统会隐式添加return语句
四、运算符
操作符的优先级由上到下逐个减小,上面行内操作符优先级大于下面操作符。
// 如果b为空,将值分配给b; 否则b不变
b ??= value;
五、流程控制语句
- if else
- for
- while 和 do-while
- break 和 continue
- switch 和 case
- assert 断言
- try-catch 和 throw
String today = 'Monday'
if(today == 'Monday'){
print("今天是星期一")
}
var message = new StringBuffer(”Hello Dart");
for (var i = 0; i < 5; i++) {
message.write("!");
print(message);
}
var _temp = 0;
while(temp < 5){
_temp++;
}
var arr = [ 0, 1, 2, 3, 4, 5, 6];
for (var v in arr) {
if (v == 2 ) {
break;
}
print(v);
}
String today = 'Monday';
switch (today) {
case 'Monday':
print('星期一');
break;
case 'Tuesday':
print('星期二');
break;
}
六、异常处理
throw FormatException('抛出一个 FormatException 异常');
throw '数据错误!';
try {
// ·
} on Exception catch (e) {
print('Exception details:\n');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace: \ n $s');
} finally {
print('Do some thing: \ n');
}
七、面向对象
构造函数
class User {
String? name; // name 成员变量
int? age; // age 成员变量
// 1.构造函数
User(this.name, this.age);
// 2.命名构造函数
User.fromJson(Map json){
name = json['name'];
age = json['age'];
}
// 3.重定向构造函数
User.init(String x) : this(x, 10);
toString(){
return '$name $age';
}
}
void main() {
var a = User.fromJson({'name':'zhangsan','age':20});
print(a.toString());
}
继承类
继承是面向对象编程技术的基石 ,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象 (实 )具有父类的实例域和方法;或子类从父类继承方法,使得子类具有父类相同的行为。 Dart 里使用extends 关键字来创建一个子类,super
关键子来指定父类。接下来定义一个动物类,动物具有吃和跑两种能力。再定义一个人类,人 类是属于动物类的,人类不仅会吃和会跑,人类还会说、会学习。所以人类相当于动物类的 一个扩展。完整的示例如下所示:
class Animal {
void eat(){
print('动物会吃');
}
void run(){
print('动物会跑');
}
}
class Human extends Animal {
void say(){
print('人类会说');
}
void study(){
print('人类会学习');
}
}
void main() {
var animal = new Animal() ;
animal.eat();
animal.run();
var human= new Human();
human.eat();
human.run();
human.say();
human.study();
}
抽象类
抽象类类似 Java 语言中的接口。 抽象类里不具体实现方法,只是写好定义接口,具体实现留着调用的人去实现。抽象类可以使用 abstract 关键字定义类。接下来写一个数据库操作的抽象类的例子。定义一个抽象类叫DateBaseOperate,里面定义4个数据库常用的操作方法“增删改查”。再定义一个类命名为DateBaseOperateImpl继承自DateBaseOperate用来实现抽象类里的方法。完整的代码如下所示:
//数据库操作抽象类
abstract class DateBaseOperate {
void insert(); //定义插入的方法
void delete(); //定义删除的方法
void update(); //定义更新的方法
void query(); //定义一个查询的方法
}
//数据库操作实现类
class DateBaseOperateImpl extends DateBaseOperate {
//实现了插入的方法
void insert() {
print('实现了插入的方法');
}
//实现了删除的方法
void delete() {
print('实现了删除的方法');
}
//实现了更新的方法
void update() {
print('实现了更新的方法');
}
//实现了一个查询的方法
void query() {
print('实现了一个查询的方法');
}
}
枚举类型
enum Color {
red,
green,
blue
}
List<Color> colors = Color.values;
八、泛型
泛型通常是为了类型安全而设计的,适当的指定泛型会生成更好的代码,可以使用泛型来减少代码重复。Dart 中使用<T>
的方式来定义泛型。例如,如果想要List只包含字符串,可以将其声明为list<String>
。
var names = new List<String>();
names.addAll(['zhangsan','lisi']);
/// 1.用于集合类型
// List: <type>
// Map: <keyType, valueType>
var names = <String>['zhangsan','lisi'];
var weeks = <String, String>{
'Monday': '星期一',
'Tuesday': '星期二'
}
// 2. 在构造函数中参数化
var users = new Map<String, User>();
九、库的使用
引用库
// 官方库
import 'dart:io';
// 第三方库
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
指定库前缀
当引用的库拥有相互冲突的名字,可以为其中一个或几个指定不一样的前缀。
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
Element element1 = new Element(); // 使用lib1
lib2.Element element2 = new lib2.Element(); // 使用lib2
引用库的一部分
如果只需要使用库的一部分内容,可以选择性引用:
- show 只引用一点;
- hide 除此之外
// 导入foo
import 'package:lib1/lib1.dart' show foo;
// 除了foo 导入其他所有内容
import 'package:lib2/lib2.dart' hide foo;
总结技巧
1. 安全调用
对于不确定是否为空的对象可以通过 ?.
的方式来访问它的属性和方法以防止空异常
List list;
print(list?.length)
2. 设置默认值
// 如果没有length 则为 -1
var len = list?.length ?? -1;
3. 简化判断
list = []
list.add(0);
list.add("");
list.add(null);
if(list[0] == null || list[0] == '' || list[0] == 0) {
print('list[0] is empty');
}
// 简化
if([null, '', null].contains(list[0])) {
print('list[0] is empty');
}