第九节: Dart 中的库/自定义库/内置库/第三方库
Dart 语法学习目录
第一节: Dart 语法了解,认识变量,常量,数据类型
第二节: Dart 操作符(运算符)
第三节: Dart 中流程控制,条件判断以及循环语句
第四节: Dart 中常用集合 List/Map
第五节: Dart 函数使用,声明函数/匿名函数/可选参数/作用域/闭包
第六节: Dart 面向对象/构造函数/静态属性
第七节: Dart中抽象类abstract/接口implements/混入Mixin
第八节: Dart中泛型/泛型定义与使用
第九节: Dart 中的库/自定义库/内置库/第三方库
1. Dart 库的介绍
1.1 Dart库的基本了解
import
和 library
指令可以用来创建一个模块化的,可共享的代码库。 库不仅提供了 API ,而且对代码起到了封装的作用.
说明:
- 默认情况下,每一个Dart文件就是一个库
- Dart中的可见性以
library
为单位 - 使用
_
表示库的私有性 - 使用
import
关键字导入库
1.2 Dart 库的分类
- 自定义库: 每一个dart文件就是一个库(类似于模块化开发中模块的概念)
- 系统内置的库: dart自带的一些库,类似于
node
中系统自带的模块 - Pub 包管理系统中的库: 第三方库, 类似于
node
中npm
包管理工具管理的第三个模块
2. Dart 库的使用
2.1 自定义库的使用
使用方法:
- 创建dart文件,例如
lib/hello.dart
- 使用自定义的dart文件,
import lib/hello.dart
示例:
创建自定义库
自定义库.png代码部分
// 自定义模块
// 1. 自定义模块中的类
class Person{
// 属性
String name;
Person(this.name);
// 方法
getInfo(){
print("大家好,我叫$name");
}
}
// 2.自定义模块中的方法
var str = "Hello";
var name = "my name is 李四";
sayHello(){
print("$str,$name");
}
使用自定义库:
使用自定义库.png运行结果:
自定义库运行结果.png2.2 系统内置库的使用
使用方式:
import "dart:math"
import "dart:io"
import "dart:convert"
注:
系统内置的库有很多, 不用可以的去记, 有道理查一下就好了
通过一个简单的示例了解Dart
内置库
// 1. 导入内置库
import "dart:math";
// 入口函数
main(){
// 2. 通过math内置库,使用Math上的方法
// 导入内置库以后就可以使用内置库的方法
// 获取最大值
var num = max(10,50);
print(num); // 50
// 获取最小值
var num2 = min(10,50);
print(num2); // 10
}
导入了数学的内置库,就可以使用math
内置库中关于数学操作的方法
内置库也有很多,在以后的学习会慢慢学习到.
2.3 第三方库的使用
Pub包管理系统中的第三方库的使用,有点类似于node
中npm
的使用
2.3.1 使用步骤
- 需要在项目根目录下新建一个
pubspec.yaml
文件,用于配置项目名称,描述,依赖等信息,类似package.json
- 通过
pub get
下载第三方库, 类似于npm install
命令 - 在项目中引入库
import "package:http:/http.dart as http"
,类似于node
中使用模块
2.3.2 搜索库的网址
dart 第三方库: https://pub.dev/
2.3.3 pubspec.yaml
文件的配置
name: main
description: 这就是一个小小例子
version: 1.0.0
# 这是开发依赖
dependencies:
http: ^0.12.1
配置图
配置yaml.png2.3.4 使用第三方库
代码:
// 1. 导入第三方库
import 'dart:convert' as convert;
import 'package:http/http.dart' as http;
// 入口函数
main() async {
// 2. 配置http请求路径
var url = 'https://api.github.com/users/mojombo';
// 3. 发送请求
var response = await http.get(url);
// 3.判断状态码是否为200 请求成功
if (response.statusCode == 200) {
var jsonResponse = convert.jsonDecode(response.body);
// 打印数据
print(jsonResponse);
} else {
print('Request failed with status: ${response.statusCode}.');
}
}
使用第三个库截图:
使用第三方库.png3. Dart库使用的特殊情况
3.1 导入的库区别名
为什么要给导入的库取别名呢, 因为导入的库可能会发生标识符冲突的问题, 我们先看看标识符冲突是怎么回事吧?
3.1.1 标识符冲突的理解
通过上面的学习,我们已经了解了,尤其以自定义库为类, 当自定库中的变量
,函数
,类
在使用是,感觉想是被定义为全局的变量
,函数
或者类
, 因为我们直接就可以使用
有点类似于定义了很多个js
文件,最后在页面中导入,
这样的情况很容易发生全局标识符冲突. dart也一样.
示例:
自定义了两个库,但是两个库中都有相同的类
代码部分:
person.dart
// 自定义库 person
// 1. 自定义模块中的类
class Person{
// 属性
String name;
Person(this.name);
// 方法
getInfo(){
print("大家好,我叫$name");
}
}
// 2.自定义模块中的方法
var str = "Hello";
var name = "my name is 李四";
sayHello(){
print("$str,$name");
}
person2.dart
// 自定义库 person2
class Person{
// 属性
String name;
int age;
Person(this.name,this.age);
// 方法
getInfo(){
print("大家好,我叫$name,今年$age岁了");
}
}
结构图:
库标识符冲突.png使用有冲突标识符的库
代码:
// 1. 使用自定义库
import "lib/person.dart";
import "lib/person2.dart";
// 入口函数
main(){
// 1.库标识符冲突
// 导入的两个库中都有Person类,
// dart不知道用哪一个
Person student = Person("张三");
student.getInfo();
}
视图:
导入有冲突标识符的不同库.png此时就会程序有问题,会报错, 因为dart不知道使用哪一个库中的Person
类
3.1.1 导入的库取别名解决标识符问题
通过as
关键字给导入的库取别名, 然后通过这个别名调用库中的变量
,函数
,以及类
.
取别名的说明:
- 一旦给导入的库取了别名,那么库中的
变量
,函数
,类
等就不能直接使用了, - 取别名的库需要通过别名来调用库中的内容
简而言之: 感觉就像是把库中的内容封装在了一个对象中,成为对象的属性或方法. 别名就是对象名
示例:
还是上面的示例: 在调用时取别名
代码部分:
// 1. 使用自定义库
import "lib/person.dart" as lib;
// 给导入的person2.dart取别名
import "lib/person2.dart";
// 入口函数
main(){
// 1. 因为person2.dart没有别名,
// 使用库中的库就是类默认是使用person2中的类
Person student = Person("张三",18);
student.getInfo();
// 2. 有别名库的使用
// 有别名的库需要使用别名调用库中的内容
// 2.1 使用别名库中的类
lib.Person student2 = lib.Person("唐三");
student2.getInfo();
// 2.2 使用别名库中的方法
lib.sayHello();
}
视图:
别名库的使用.png3.2 导入库中的一部分内容
情况说明:
- 有的时候我们不见得需要导入库中的所有方法
- 因此我们就可以有针对性的使用库中的我们需要的那一部分代码
示例,先看一看正常使用库,
代码:
// 自定义库
// 方法一
getInfo(){
print("getInfo方法");
}
// 方法二
getInfo2(){
print("getInfo2方法");
}
// 方法二
getInfo3(){
print("getInfo3方法");
}
视图:
多方法自定义库.png如果按照正常导入库的流程,三个方法都可以使用
代码部分:
// 1. 使用自定义库
import "lib/getInfo.dart";
// 入口函数
main(){
// 使用自定义方法中的三个库
getInfo(); // getInfo方法
getInfo2(); // getInfo2方法
getInfo3(); // getInfo3方法
}
视图:
正常使用自定义库.png通过上的示例我们知道, 正常使用库的使用,是可以使用库中的所有方法的, 但有的使用只要使用库中的一部分代码
3.2.1 使用show关键字,指定库中需要使用的部分
通过示例了解show
的使用
代码部分:
// 1. 使用自定义库
// 通过show关键字指定使用库中的那一部分
import "lib/getInfo.dart" show getInfo;
// 入口函数
main(){
// 当我们通过show指定使用库中的内容后
// 只有我们指定方法一使用,
// 未指定的方法不能使用
getInfo(); // getInfo方法
getInfo2(); // getInfo2方法
getInfo3(); // getInfo3方法
}
视图:
show关键字.png3.2.1 使用hide关键字,指定库中不需要使用的部分
相信通过刚才的学习,你已经对于show
的使用有一定的来了解了,
那么反过来思考,如果库中只有一个我们不需要使用的方法,那么通过show
来罗列所有需要使用发方法就显得特别繁琐
所以dart中也可以使用hide
关键字指定库中不需要使用的方法,未指定的都是可以使用的.
代码:
// 1. 使用自定义库
// 通过hide关键字指定库中不使用的部分
import "lib/getInfo.dart" hide getInfo;
// 入口函数
main(){
// 当我们通过hide指定库中不需要使用的内容
// hide关键字方法指定的是不需要使用的内容
// 未指定的方法都能使用
getInfo(); // getInfo方法
getInfo2(); // 直接标红不能使用
getInfo3(); // 直接标红不能使用
}
示例:
hide关键字指定不需要使用的内容.png