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.10.0 <3.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(String name, int age) {
this.name = name;
this.age = 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(String name, int age) {
this.name = name;
this.age = 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 = 12345;
print('类型关键字定义变量:$num2');
}
5 常量类型
- 常量:定义的变量不变,使用final或const关键字定义。
- final是惰性初始化,即在运行时第一次使用前才初始化。
- final的值只能被设定一次,是一个运行时常量,const则是一个编译时常量。
main() {
String str = '变量值1';
// 变量可以改变值
str = '变量值2';
print('定义变量:$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);
}