Dart

Dart简介

  • Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用和物联网等领域的开发
  • Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视,要学Flutter的话我们必须首先得会Dart
  • 官方文档:https://dart.cn/

环境搭建

  • 要在我们本地开发Dart程序的话首先需要安装Dart SDK,进入官网:https://dart.cn/get-dart
  • Windows系统推荐:https://gekorm.com/dart-windows/,下载后安装即可
  • 安装程序默认是会把dart添加进系统变量path中,可以打开cmd命令行,输入 dart --version,有版本信息打印即表示安装成功
  • 然后在VsCode开发工具上安装DartCode Runner两个插件
  • 新建index.dart文件,开始第一个代码实现
1
2
3
main(){
print('你好 dart');
}

语法

变量/常量

  • dart是一个强大的脚本类语言,可以不预先定义变量类型,自动会类型推倒。与C语言类似,需要加;结尾一个语句,变量命名不能以数字开头
  • dart中定义变量可以通过var关键字可以通过类型来申明变量
1
2
3
4
5
void main(){
var str = '你好';
String s = '你好';
int num = 0;
}
  • const值不变一开始就得赋值;final可以开始不赋值,且只能赋一次;final不仅有 const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第次使用前才初始化;
  • 永远不改量的量,请使用finalconst修饰它,而不是使用var或其他变量类型
1
2
3
4
5
6
void main(){
const PI = 3.14;
final num = 3.14;
final time = new DateTime.now();
// const t = new DateTime.now(); 报错
}

数据类型

  • 字符串类型String
1
2
3
4
5
6
7
8
9
void main(){
// 1. 字符串
String str = '''hello'''; // 三个单引号可以写多行字符串
// 2. 字符串拼接
String str1 = '你好';
String str2 = 'Dart';
print("$str1 $str2");
print(str1+str2);
}
  • 数值类型有两种intdouble,其中double既可以是整型也可以是浮点型
1
2
3
4
5
6
void main(){
// 1. int
int a = 0;
// 2. double
double b = 0.12;
}
  • 布尔类型bool
1
2
3
4
5
6
7
8
9
void main(){
// 1. 布尔类型
bool flag = true;
if(flag){
print("真");
}else{
print("假");
}
}
  • 集合类型list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void main(){
// 1. 第一种定义List的方式
var list = ['张三',20,true];
print(list);
print(list.length);
print(list[0]);

// 2. 第二张定义list的方式
var list2 = <String>['张三','李四','王五']; // 限制类型
print(list2);

// 3. 第三种定义list的方式
var list3 = [];
list3.add('张三');
list3.add('李四');

// 4. 第四种定义list的方式
var list4 = List.filled(2, "");//创建一个固定长度的集合
list4[0] = '123';

var list4 = List<String>.filled(2, "");
}
  • Maps键值对类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void main(){
// 1. 第一种定义Maps的方式
var person = {
"name":"张三",
"age":20,
"work":['吃饭','睡觉']
};
print(person);
print(person["name"]);

// 2. 第二种定义Maps的方式
var map = new Map();
map["name"] = "李四";
map["age"] = 20;
map["work"] = ['吃饭','睡觉'];
}
  • 使用is关键字判断数据类型
1
2
3
4
5
6
7
8
void main(){
var str = 123;
if(str is String){
print('String类型');
}else if(str is int){
print('int类型');
}
}
  • 数据类型转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void main() {
// 数值类型转字符串类型 toString
int number = 10;
var numStr = number.toString();
// 字符串类型转数值类型 parse
String str = "123";
var num = int.parse(str);

// 异常处理
try {
String str = "0";
var num = int.parse(str);
print(num);
} catch (err) {
print(0);
}

// isEmpty 判断字符串是否为空,可以用于转bool类型
var str = 'xxx';
if(str.isEmpty){
print("str空");
}else{
print("str不为空");
}
}

函数类型

  • Dart定义函数和C语言一致,参数可以通过$xxx获取
1
2
3
4
5
6
7
8
9
10
11
12
13
void printInfo() {
print('我是方法');
}
void main() {
printInfo();
int getNum() {
int i = 0;
return i + 1;
}
String getUserInfo(String username,int age){
return "姓名$username---年龄$age";
}
}

Dart库

自定义库

  • Dart中,库的使用时通过import关键字引入的;library指令可以创建一个库,每个Dart文件都是一个库,即使没有使用library指令来指定
  • 比如自定义一个库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Animal{
String _name; // 私有属性
int age;
// 默认构造函数的简写
Animal(this._name, this.age);

void printInfo() {
print("${this._name}---${this.age}");
}

String getName() {
return this._name;
}
void _run() {
print("这是一个私有方法");
}

execRun(){
this._run(); // 类里面方法的相互调用
}
}
  • 然后引入并使用
1
2
3
4
5
import 'Animal.dart';
main(){
var dog = new Animal('小黑狗',20);
print(dog.getName());
}
  • 如果只需要导入库的一部分,有两种模式
    • 模式一:只导入需要的部分,使用show关键字
    • 模式二:隐藏不需要的部分,使用hide关键字
1
2
import 'package:lib1/1ib1.dart' show foo;
import 'package:lib2/1ib2.dart' hide foo;

系统库

  • 系统库以dart:xx前缀,使用dart:io请求接口
  • 只有async方法才能使用await关键字调用方法;如果调用别的async方法必须使用await关键字
  • async是让方法变成异步;await是等待异步方法执行完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import 'dart:io';
import 'dart:math';
import 'dart:convert';
void main() async{
print(min(12, 1));
var result = await _getDataFromAPI();
print(result);
}

// API接口 http://news-at.zhihu.com/api/3/stories/latest
_getDataFromAPI() async {
//1. 创建HttpClient对象
var httpClient = new HttpClient();
//2. 创建uri对象
var uri = new Uri.http('news-at.zhihu.com','/api/3/stories/latest');
//3. 发起请求,等待请求
var request = await httpClient.getUrl(uri);
//4. 关闭请求,等待响应
var response = await request.close();
//5. 解码响应的内容
return await response.transform(utf8.decoder).join();
}

第三方库

  • 如果需要第三方库,需要有一下步骤
    • 需要在自己想项目根目录新建一个pubspec.yaml
    • pubspec.yaml文件 然后配置名称、描述、依赖等信息
    • 然后运行dart pub get获取包下载到本地
    • 项目中引入库import 'package:http/http.dart' as http; 看文档使用
  • 第三方库一般管理在pub包管理系统中,从以下网站可以找到要用的库
  • 创建一个pubspec.yaml文件,内容如下
1
2
3
4
5
6
name: xxx
description: A new flutter module project.
environment:
sdk: '>=2.10.0 <3.0.0'
dependencies:
http: ^0.13.4
  • 然后在当前目录下运行以下命令
1
dart pub get
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import 'dart:convert' as convert;

import 'package:http/http.dart' as http;

void main(List<String> arguments) async {
// This example uses the Google Books API to search for books about http.
// https://developers.google.com/books/docs/overview
var url =
Uri.https('www.googleapis.com', '/books/v1/volumes', {'q': '{http}'});

// Await the http get response, then decode the json-formatted response.
var response = await http.get(url);
if (response.statusCode == 200) {
var jsonResponse =
convert.jsonDecode(response.body) as Map<String, dynamic>;
var itemCount = jsonResponse['totalItems'];
print('Number of books about http: $itemCount.');
} else {
print('Request failed with status: ${response.statusCode}.');
}
}