Dart诞生于2011年10月10日,是一种“结构化的Web编程”语言,应用于Web、服务器、移动应用等领域的开发。
1 概述
- Dart程序有统一的程序入口,即
main()函数入口,与Java、C或C++语言相似。 - 一切皆对象,所有对象都是类的实例,所有对象都继承自内置的Object类,类似于Java语言。
- Dart语言是弱数据类型,指定类型非必须,指定数据类型和编译时的常量,可提高运行速度。
- Dart没有public、protected和private的概念,私有特性通过变量或函数,加上下划线来表示。
- Dart工具可以检查出warning警告信息和errors错误信息。
- 警告信息,表明代码可能不工作,但是不会妨碍程序运行。
- 错误信息,可能是编译时的错误,也可能是运行时的错误。
- 编译时的错误将阻止程序运行,运行时的错误会以exception异常方式呈现。
1-1 入口方法
// 入口方法
// main() {
// print('入口方法');
// }
// 表示main方法没有返回值
void main() {
// 打印信息
print('入口方法');
}
1-2 注释方法
// 注释方法一
/* 注释方法二 */
/// 注释方法三
main() {
print('注释方法');
}
2 关键字
- 限制类保留字:
await、yield。 - 上下文关键字:
async、hide、on、show、sync。 - 保留字
super、void、rethrow、while、this、try、return、do。const、true、finally、final、null、var、assert、is。break、case、default、class、with、new、throw、continue。catch、else、extends、false、enum、for、switch、if、in。
- 内置标识符
abstract、dynamic、covariant、Function、export、set。operator、typedef、interface、external、import、get、part。deferred、library、implements、factory、static、as、mixin。
3 Dart库
- 自定义的库:
import 'lib/xxx.dart';。 - 系统内置库:
import 'dart:convert';。dart:io:文件读写I/O相关操作的库。dart:svg:事件和动画的矢量图支持。dart:core:内建类型、对象及核心功能。dart:html:网页开发使用到的库,使用频率高。dart:math:数字常量及函数,提供随机数算法。dart:async:异步编程支持,提供Future和Stream类。dart:convert:不同类型之间的字符编码、解码支持。dart:collection:对dart:core内置库提供更多的集合支持。
- Pub包管理系统中的第三方库:https://pub.dev/。
import 'dart:math';
main() {
print('最小值:' + min(25, 27).toString());
print('最大值:' + max(25, 27).toString());
}
3-1 实现请求数据
import 'dart:io';
import 'dart:convert';
void main() async {
var result = await getDataFromAPI();
print(result);
}
// API接口:http://news-at.zhihu.com/api/3/stories/latest
getDataFromAPI() async {
// 创建HTTPClient对象
var httpClient = new HttpClient();
// 创建URI对象
var uri = new Uri.http('news-at.zhihu.com', '/api/3/stories/latest');
// 发起请求,等待响应
var request = await httpClient.getUrl(uri);
// 关闭请求,等待响应
var response = await request.close();
// 解码响应的内容
return await response.transform(utf8.decoder).join();
}
3-2 async和await
- 只有async方法才能使用await关键字调用方法。
- 如果调用别的async方法必须使用await关键字。
- async是让方法变成异步,await是等待异步方法执行完成。
void main() async {
var result = await testAsync();
print(result);
}
// 异步方法
testAsync() async {
return '异步方法';
}
3-3 导入第三方库
- 项目的根目录下新建一个
pubspec.yaml文件,在文件中配置名称、描述、依赖等信息。 - 命令窗口进入
pubspec.yaml文件路径下,输入dart pub get回车获取包下载到本地。 - 项目中引入库需使用import命令,例如:
import 'package:http/http.dart' as http;。
(1) pubspec.yaml
name: xxx
description: pubtest
environment:
sdk: ">=2.12.0 <4.0.0"
dependencies:
http: ^0.13.5
date_format: ^2.0.7
(2) 使用第三方库
import 'dart:convert' as convert;
import 'package:http/http.dart' as http;
import 'package:date_format/date_format.dart';
main() async {
var url = Uri.http('news-at.zhihu.com', '/api/3/stories/latest');
// 等待HTTP响应,然后对Json格式的响应进行解码
var response = await http.get(url);
if (response.statusCode == 200) {
var jsonResponse = convert.jsonDecode(response.body);
print(jsonResponse);
} else {
print('请求失败,状态为:${response.statusCode}');
}
print(formatDate(DateTime(2024, 01, 03), [yyyy, '-', mm, '-', dd]));
}
3-4 库的冲突问题
lib:
- person1.dart
- person2.dart
(1) person1.dart
class Person {
String name;
int age;
// 默认构造函数的简写
Person(this.name, this.age);
Person.setInfo(this.name, this.age);
void printInfo() {
print('Person1:${this.name}---${this.age}');
}
}
(2) person2.dart
class Person {
String name;
int age;
// 默认构造函数的简写
Person(this.name, this.age);
Person.setInfo(this.name, this.age);
void printInfo() {
print('Person2:${this.name}---${this.age}');
}
}
(3) 重命名一个库
import 'lib/person1.dart';
import 'lib/person2.dart' as lib;
main() {
Person p1 = new Person('张三', 21);
p1.printInfo();
lib.Person p2 = new lib.Person('李四', 22);
p2.printInfo();
}
3-5 引入部分功能
lib:
- info.dart
(1) info.dart
void getName() {
print('张三');
}
void getAge() {
print(21);
}
void getSex() {
print('男');
}
(2) 关键字使用
// 隐藏不需要的部分,使用hide关键字
import 'lib/info.dart' hide getAge;
// 只导入需要的部分,使用show关键字
import 'lib/info.dart' show getName;
void main() {
getName();
// 已隐藏,会报错
// getAge();
}
3-6 延迟加载(懒加载)
- 懒加载:即需要时再加载,最大好处是减少APP的启动时间,通过
loadLibrary()方法加载。 - 使用deferred as关键字进行指定,例如:
import 'lib/hello.dart' deferred as hello;。
lib:
- hello.dart
(1) hello.dart
void sayHello() {
print('你好!');
}
(2) deferred as
import 'lib/hello.dart' deferred as hello;
void main() async {
await hello.loadLibrary();
hello.sayHello();
}
4 变量类型
- Dart是脚本类语言,可以不预先定义变量类型,它会自动推导类型。
- 可以使用var关键字来声明变量,也可以通过类型关键字来定义变量。
- 变量命名规则
- 变量名必须由数字、字母、下划线
_和美元符$组成。 - 标识符开头不能是数字,标识符不能是保留字和关键字。
- 变量名区分大小写,尽量见名知义,变量名用名词,方法名用动词。
- 变量名必须由数字、字母、下划线
main() {
// 使用var关键字定义变量
var str1 = 'var关键字定义变量';
print(str1);
var num1 = 123;
print('var关键字定义变量:$num1');
// 通过类型关键字定义变量
String str2 = '类型关键字定义变量';
print(str2);
int num2 = 123;
print('类型关键字定义变量:$num2');
}
5 常量类型
- 常量:定义的变量不变,使用final或const关键字定义。
- final是惰性初始化,即在运行时第一次使用前才初始化。
- final的值只能被设定一次,是一个运行时常量,const则是一个编译时常量。
main() {
String str = '变量值1';
// 变量可以改变值
str = '变量值3';
print('string关键字定义变量:$str');
// const关键字定义常量
const PI1 = 3.14159;
// 常量不可以改变值,改变值将报错
// PI1 = 3.14159267;
print('const关键字定义常量:$PI1');
// final关键字定义常量
final PI2 = 3.14159;
// PI2 = 3.14159253;
print('final关键字定义常量:$PI2');
// final关键字是运行时常量
final time1 = new DateTime.now();
print(time1);
// const关键字是编译时常量
// const time2 = new DateTime.now();
// print(time2);
}